2013-02-14 15 views
5

Asıl olarak (Önceki soruya bakın "Java how to make JFrames start off as a maximised window") En üst düzeye çıkan bir pencere yapmak istedim. Bu kod başarmaktadır: Bu pencere aşağı restore eğerJava JFrame'leri nasıl büyütülür, ancak yeniden boyutlandırılabilir değil

public static void main(String[] args) { 

JFrame frame = new JFrame(); 
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setVisible(true); 

} 

Ancak, bir pratik olmayan çubuk haline gelir. Bunu çözmek için, setSize() kullanarak pencereye bir boyut ayarlıyorum. Bu çalışır ama başka bir sorun sunar, pencere hala yeniden boyutlandırılabilir.

Bu sorunu çözmek için setResizable (false);

public static void main(String[] args) { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    JFrame frame = new JFrame("Jedia"); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setSize(screenSize); 
    frame.setResizable(false); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

Ancak, artık pencere (ziyade maksimize yerine) kendi belirtilen boyutta başlar ve yukarı geri alınamaz: ve bunun şimdiye kadar benim kodudur.

Yani, sorum şu, pencereyi nasıl en üst düzeye çıkartabilirim, ne zaman geri yüklendiğimi ve yeniden boyutlandırmayı yeniden yapılandırabilir miyim? Veya maksimize edilen ve geri yüklenemeyen bir pencere oluşturulsun mu?

cevap

3

hemen her zaman çalışır basit bir düzeltme yok: görünür set ettikten sonra çerçeve boyutlandırılabilir değil olun.

public static void main(String[] args) { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    JFrame frame = new JFrame("Jedia"); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setSize(screenSize); 
    frame.setVisible(true); // FIRST visible = true 
    frame.setResizable(false); // THEN resizable = false 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

Bu şekilde, çerçeve maksimize başlayacaktır ve kapla düğmesine kullanmak için kullanıcı önlenmesi, gri olacaktır: Yani sadece kod bu şekilde değiştirir. (Bunu neden yapmak zorunda olduğunuzu gerçekten bilmiyorum. En üst düzeye çıkarılan durumun yalnızca pencere görünür hale geldiğinde uygulanacağını ve önceden uygulanamaz hale getirilip uygulanmadığını varsayalım).

Windows 7'de her zaman en azından, başlık çubuğunu tıklayıp sürükleyerek pencerenin en üst düzeye çıkmasını sağlayabilirsiniz. Ama daha önce ayarladığınız boyutta olacak. Sorun şu ki, kullanıcınız bunu tekrar en üst düzeye çıkaramayacak ve dinleyicilerin pencereyi maksimum duruma getirmesini sağlayacak bir yol bulamadım. (Edit: @David Kroukamp cevabının son bölümünde bir ComponentListener kullanarak maksimum duruma zorlamak mümkün olduğunu gösterir. Bu nedenle, setResizable(false) kullanmak zorunda değilsiniz. sürükleyerek eylem kullanıcılar olması gereken yerde geri koymak için maksimize düğmesini kullanmak mümkün olacak sebebi ne olursa olsun ama bu olayın yakalanan değildir.)

Şimdi, neredeyse bu tür yapmak için bir neden yoktur asla şeylerin Kullanıcılar pencerelerini değiştirmelerini engellediğinizde gerçekten hoşlanmazlar (örneğin, en üst düzeye getirilmiş pencereler hareket ettirilemez ve birden fazla ekrana sahip olduğunuzda rahatsız edici olabilir). Bir istisna, genellikle tam ekran olan bir oyun yapıyorsanız. Ama sonra bir JFrame istemezsin çünkü tüm süslemeyi istemiyorsun, ama bir Pencere.

Sorununuz varsayılan pencere boyutu çok küçükse, normaldir. Önce çerçevenize bir şey eklemeniz (bazı kontroller, düğmeler, uygulamanızda ne istediğinizi), düzenleri kullanarak (bu önemli) çerçevenize pack() yöntemini çağırın. Pencereniz için iyi bir varsayılan boyut seçecektir. Son bir sözcük,

Son olarak,. Örnek kodumu bir main yönteminde bir kısayol olarak ekledim, ancak her zaman Swing EDT'de SwingUtils.invokeLater()'u kullanarak Swing şeyler yapmalısınız.

+1

Çok teşekkürler! Bu çalışıyor. Dürüst olmak gerekirse sadece salıncak almaya başladım, bu yüzden sadece bir şeyi uygulamaktan çok yapmak istedim! Tekrar teşekkürler! –

0

Hangi ortamda çalışıyorsunuz? Ben Win7 altında JDK1.6/JDK1.7 ile denedim ve beklendiği gibi çalışır (pencere başlatılır, görev çubuğuna en aza indirir).

+0

Orta düğmeden bahsediyorum, "geri yükleme". En aza indirecek bir şey yok. Kodu setResizable olmadan çalıştırın ve başlamasını nasıl istediğimi göreceksiniz. –

1

Bazen, JFrame parametrelerini ayarladığınız sıraya dikkat etmelisiniz.

Ayrıca, olay dağıtım iş parçacığında Swing bileşenleri kullanmalısınız.

Bunu deneyin ve yardımcı olup olmadığını görün.

public static void main(String[] args) {   
    final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame frame = new JFrame("Jedia"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(screenSize); 
      frame.setResizable(false); 
      frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
      frame.setVisible(true); 
     } 
    }); 
} 
+0

Bu pencerenin ekranı maksimum değil. Hala etrafta sürüklenebilir ve geri yükleme düğmesi kullanılamaz. Yine de teşekkürler. –

0

Sizin için işe yarayacak bir kandırdım. (o benim için çalıştı) bu kodu deneyin:

public static void main(String[] args) { 

    final JFrame frame = new JFrame("Jedia"); 
    frame.setMinimumSize(new Dimension(600, 400)); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setVisible(true); 

    frame.addComponentListener(new ComponentListener(){ 

     @Override 
     public void componentHidden(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void componentMoved(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void componentResized(ComponentEvent e) { 

      if (!e.paramString().startsWith("COMPONENT_RESIZED (-8,-8")) 
      frame.setSize(new Dimension(600, 400)); 
     } 

     @Override 
     public void componentShown(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 
    }); 
} 

e.paramString() gibi görünen bir dize döndürür "COMPONENT_RESIZED (-8, -8, [screensize])" Bir eylemi geri yüklediğinizde gerçekleşir.