2014-11-05 74 views
0

我遇到了JFrame大小的問題:Java - 設置裝飾JFrame的大小

我想在Jframe中顯示內容。內容的尺寸爲640 x 480.但我無法使用方法JFrame.setSize(640, 480);,因爲我也想顯示窗口的裝飾。 我的第一個想法是:添加一個首選維的面板,並使用pack();.但是這也行不通 - 我只得到一個非常小的窗口。

我認爲,解決我的問題可能與此類似:

這裏是我的代碼:

import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Fenster extends JFrame { 

    JPanel panel; 
    Dimension dim; 

    Fenster(){ 

     dim = new Dimension(640, 480); 

     panel = new JPanel(); 
     panel.setSize(dim); 
     panel.setMinimumSize(dim); 
     panel.setMaximumSize(dim); 
     panel.setPreferredSize(dim); 
     panel.setBounds(0, 0, 640, 480); 
     panel.setDoubleBuffered(true); 

     JLabel label = new JLabel("bla"); 
     panel.add(label); 

     this.setLayout(null); 
     this.getContentPane().add(panel); 
     this.setLocationRelativeTo(null); 
     this.setResizable(false); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 

     this.pack(); 
     this.setVisible(true); 

    } 


} 
+0

' this.setLayout(null);'是你的問題。讓佈局經理做它的工作 – MadProgrammer 2014-11-05 23:56:13

+0

以前你提到的問題並不是完全相同的問題,或者至少被接受的解決方案是不正確的...... – MadProgrammer 2014-11-06 00:04:56

+0

*「我的第一個想法是:添加一個面板與優先維度和比使用包();「*你的第一個想法是正確的(如在最佳實踐中,可以使工作)。我會堅持搞清楚它爲什麼失敗。 – 2014-11-06 00:12:00

回答

2

this.setLayout(null);是你的問題。讓佈局管理器做的工作

JavaDocs

公共無效包()

此窗口的大小,以適合其子組件的 首選大小和佈局。如果 尺寸中的任何一個尺寸小於前面調用setMinimumSize方法的 指定的最小尺寸,則結果寬度 和窗口高度會自動放大。

如果窗口和/或其所有者尚不可顯示,則在計算首選大小之前,它們都可以顯示爲 。該窗口在 正在計算其大小後進行驗證。

大多數容器(JComponentJPanel)有一個默認的0x0首選大小,佈局管理器提供了基於佈局管理器本身的要求和容器中的內容信息,但使用null,你用途不同使容器0x0 ...

No more null layouts

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setUndecorated(true); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      add(new JLabel("Look ma, no null layouts!")); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(640, 480); 
     } 

    } 

} 

避免使用null佈局,PIXE l完美的佈局是現代UI設計中的幻想。影響組件的個體大小的因素太多,其中沒有一個可以控制。搖擺設計爲核心與佈局管理工作,丟棄這些會導致沒有問題,問題最終,你將花費越來越多的時間,試圖糾正

Why is it frowned upon to use a null layout in SWING?瞭解更多詳情...