2011-08-13 143 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组件所需的空间除外。