2011-08-13 140 views
6

我仍在試圖瞭解佈局管理器是如何工作的。我用兩個JPanel做了一個Frame。 第一個包含帶boxLayout的textArea。 第二個包含一個帶按鈕的流佈局。佈局管理器preferredSize Java

我相應地設置每個面板的首選大小,打包它們,但得到意想不到的結果。

import java.awt.*; 
import javax.swing.*; 

public class LayoutMgrTest 
{ 
    public static void main(String[] args) 
    { 
     TableBasic frame = new TableBasic(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setVisible(true); 


     frame.getContentPane().setLayout(new GridLayout(2,1)); 

     JPanel controlPane = new JPanel(); 
     JPanel buttonPane = new JPanel(); 

     controlPane.setLayout(new BoxLayout(controlPane, BoxLayout.PAGE_AXIS)); 
     controlPane.setPreferredSize(new Dimension(200, 200)); 
     controlPane.add(new JScrollPane(new JTextArea())); 

     buttonPane.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     buttonPane.setPreferredSize(new Dimension(100,20)); 
     buttonPane.add(new JButton("Button1")); 
     buttonPane.add(new JButton("Button2")); 

     frame.getContentPane().add(controlPane, BorderLayout.NORTH); 
     frame.getContentPane().add(buttonPane, BorderLayout.SOUTH); 
     frame.setSize(new Dimension(500,500)); 
     frame.pack(); 
    } 
} 

無論我做什麼,如果我使用網格佈局,它似乎永遠分配的可用空間的一半每個控制。我被告知:

每行的高度取決於每行添加的每個組件的高度 。

的buttonpane的高度爲20。它的分配比它更:

Wasted space

有什麼不對的代碼?
我想離開這兩個JPanels完整請。將文本框和按鈕直接添加到框架很容易,但我需要使用JPanels(因爲我將添加邊框和其他東西)。

回答

7

這是使用GridLayout作爲佈局管理器的結果。它更改爲BorderLayout的:

frame.getContentPane().setLayout(new BorderLayout()); 

例如,該代碼(I變化不大盡可能從原始):

import java.awt.*; 
import javax.swing.*; 

public class LayoutMgrTest 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     //frame.setVisible(true); 
     //frame.getContentPane().setLayout(new BorderLayout()); 

     JPanel controlPane = new JPanel(); 
     JPanel buttonPane = new JPanel(); 

     controlPane.setLayout(new BoxLayout(controlPane, BoxLayout.PAGE_AXIS)); 
     controlPane.setPreferredSize(new Dimension(200, 200)); 
     controlPane.add(new JScrollPane(new JTextArea())); 

     buttonPane.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     buttonPane.setPreferredSize(new Dimension(100,40)); 
     buttonPane.add(new JButton("Button1")); 
     buttonPane.add(new JButton("Button2")); 

     frame.add(controlPane, BorderLayout.NORTH); 
     frame.add(buttonPane, BorderLayout.SOUTH); 
     //frame.setSize(new Dimension(500,500)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

生成此幀:

enter image description here

+0

@mKorbel - 謝謝。我的做法總是儘可能少地改變,但是你認爲我更好:) – MByD

+0

快手男,歡迎您 – mKorbel

+0

感謝您的回答。這段時間有點晚了mKorbel:P你通常總是對Swing GUI有很大的幫助:) – David

6

我相應地設置了每個面板的首選尺寸,

這是另一個問題。你不應該設置首選大小。這是佈局經理的工作。只需將您的組件添加到面板並讓佈局管理器完成其工作即可。

大多數組件都有默認的首選大小。對於一些你需要給它一點小費。 對於使用文本區域時,你會用給予「推薦」首選大小例如:

JTextArea textArea = new JTextArea(rows, columns); 
+0

好主意,我會盡量避免它。這次我正在試驗。 – David

+0

不正確; preferredSize是佈局管理器基於其計算的值之一(不是所有這些值)。他們的計算結果是size屬性,而不是preferredSize。 –

+3

@邁克爾,我站在我的公共場所。海報不應該設置'controlPane'或'buttonPane'的首選大小。佈局管理器將根據添加到它們的組件確定這些面板的首選大小。這些信息將被用於根據添加到框架的所有面板的首選大小來打包()框架。是的,佈局經理將設置每個面板的大小/位置。 – camickr

3

如果您使用的佈局管理,你不應該除了框架組件上設置大小。

組件的大小從不同的佈局管理器計算。

你在你的代碼http://download.oracle.com/javase/tutorial/uiswing/layout/howLayoutWorks.html

找到更多的相關信息,您可以用文本區域,以BorderLayout.CENTER添加面板。這應該可以解決你的問題。 BorderLayout.CENTER中的組件佔用整個空間,但NORTH,EAST,SOUTH和WEST組件所需的空間除外。