2013-11-27 47 views
1

我正在處理簡單登錄屏幕的佈局。我爲了使用網格佈局操縱的元素,但整個問題都來了,它佔據了這樣的全畫幅寬度:如何修復JPanel與佔據框架全寬的網格?

enter image description here

在哪裏,我希望它是一個固定的位置和寬度,高度和垂直,水平居中在一個框架內,但不佔用它的全尺寸。 可能會使用戶名和密碼標籤佔用較少的空間,所以文本字段實際上更接近它們。我嘗試設置我的面板的主要尺寸,如.setMaximumSize(Dimension (200, 150));

但它似乎不工作。

 //Create the frame. 
     JFrame frame = new JFrame("Online Shop"); 
     JPanel mainPanel = new JPanel(); 
     JPanel usernamePanel = new JPanel(); 
     JPanel passwordPanel = new JPanel(); 
     JPanel buttonPanel = new JPanel(); 

     JButton loginButton = new JButton("Login"); 
     loginButton.setMaximumSize(new Dimension(100, 50)); 
     JTextField username = new JTextField(); 
     JLabel usernameLabel = new JLabel("Username"); 
     JPasswordField password = new JPasswordField(); 
     JLabel passwordLabel = new JLabel("Password"); 

     //Panel 
     frame.setContentPane(mainPanel); 

     usernamePanel.setLayout(new GridLayout(1,2)); 
     usernamePanel.add(usernameLabel); 
     usernamePanel.add(username); 

     passwordPanel.setLayout(new GridLayout(1,2)); 
     passwordPanel.add(passwordLabel); 
     passwordPanel.add(password); 

     mainPanel.setLayout(new GridLayout(3, 1)); 
     mainPanel.add(usernamePanel); 
     mainPanel.add(passwordPanel); 
     mainPanel.add(loginButton); 

     //Event Listeners 
     frame.addWindowListener(new MyWindowListener()); 
     loginButton.addActionListener(new MyActionListener()); 

     //Sizes, Positioning 
     frame.setSize(720, 480); 
     frame.setLocationRelativeTo(null); 

     //Show Frame 
     frame.setVisible(true); 
+0

注意'GridLayout'將*總是*看起來像垃圾。我通常會使用複合佈局或「GroupLayout」來處理這些事情。同時強烈同意camickr&trashgod明確設定尺寸是一個非常糟糕的主意。請參閱[我是否應避免使用Java Swing中的set(Preferred | Maximum | Minimum)Size方法?](http://stackoverflow.com/q/7229226/418556)(是) –

回答

4
frame.setSize(720, 480); 

不要使用setSize()方法。

而是使用:

frame.pack(); 

還可以使用:

JTextField username = new JTextField(10); 

爲了給文本字段中的字符的優選數。

現在,當框架可見時,組件將以其首選尺寸顯示,並且框架的尺寸將根據組件進行適當調整。

如果要安裝的組件和框架之間的一點點額外的空間,那麼你可以做:一個登錄屏幕僅採用

mainPanel.setBorder(new EmptyBorder(20, 20, 20, 20)); 
+0

使用包很好,但是如果我擴展它仍然保持這種「拉伸」行爲,此外我需要能夠操縱面板的尺寸以及框架的某個起始尺寸。有沒有辦法讓我操作面板尺寸 – Ilja

+0

這是一個登錄屏幕。用戶沒有理由調整對話框的大小。使用'setResizable(false)'方法。但是,解決此問題的一種方法是創建一個名爲「contentPane」的添加面板。將contentPane添加到框架。然後將mainPanel添加到contentPane。默認情況下,面板使用FlowLayout,並且保留添加到其中的組件的首選大小。 '此外我需要能夠操縱面板尺寸 - 這很少是一個好的要求。再次,Swing更好地知道組件的首選大小應該基於字體等等。 – camickr

+0

@camickr是正確的;另外,驗證你是否避免了這個[陷阱](http://stackoverflow.com/a/12532237/230513)。 – trashgod