我不能让BoxLayout的setPreferredSize()方法以我想要的方式工作

时间:2011-07-09 04:18:31

标签: java swing layout-manager boxlayout

我想我解决了我的问题,但我不知道为什么会这样,所以我希望有人可以向我解释,所以我不会再犯同样的错误。

这是一个快速示例,可以编写我正在尝试的内容:

public class BoxLayoutTest extends JFrame
{
  public BoxLayoutTest()
  {
    setSize(400,300);
    JPanel mainPanel = new JPanel(new FlowLayout());
    setContentPane(mainPanel);

    JPanel subPanel = new JPanel();
    subPanel.setLayout(new BoxLayout(subPanel, BoxLayout.PAGE_AXIS));
    subPanel.setBackground(Color.BLUE);

    JLabel labelTest = new JLabel("This is a test");
    subPanel.add(labelTest);

    labelTest.setPreferredSize(new Dimension(150, 20));
    mainPanel.add(subPanel);
    System.out.println(mainPanel.getSize());
  }

  public static void main( String[] args )
  {
    BoxLayoutTest testFrame = new BoxLayoutTest();
    testFrame.setVisible(true);
  }
}

首先,我遇到了包含JLabel的面板的问题,而不是像首选大小一样调整大小。我发现这是因为我使用mainPanel.getSize()的一些变体作为我的子面板的首选大小。在这个例子中,我使用实际的数字值,这是有效的。

它之所以不起作用的原因(实际上我想让某人解释的是),为什么,如SOP行中所见,mainPanel.getSize()返回宽度和高度它显然需要整个屏幕,即400x300。

感谢@camickr告诉我不应该为我的Panel设置preferredSize,这有助于我找出问题的来源。

2 个答案:

答案 0 :(得分:2)

很难说为什么你的代码不起作用,因为你没有发布你的代码。一些随机的代码行没有给出我们在程序中如何使用代码的上下文。

当您发布问题时,您需要发布展示问题的SSCCE

胶水不应该解决问题。面板应该仍然显示,它可能不会显示在您期望的位置。 BoxLayout将尝试调整添加到其中的组件的大小,以填满可用的整个空间。

您不应该在面板上使用setPreferredSize()。布局管理器的工作是根据添加到其中的所有组件的首选大小来计算面板的首选大小。所以我会说你的代码仍然是错误的。

  

输入this和this.getContentPane()

之间有区别

某些方法调用会自动转发到帧的内容窗格,这就是最终结果相同的原因。阅读JFrame API。这在API描述或相关方法中得到解决。

答案 1 :(得分:2)

  

为什么[确实] mainPanel.getSize()返回宽度和高度0?

直到pack()“导致此Window的大小适合其子组件的首选大小和布局,”维度将为零。

System.out.println(mainPanel.getSize());
this.pack();
System.out.println(mainPanel.getSize());

控制台:

java.awt.Dimension[width=0,height=0]
java.awt.Dimension[width=160,height=30]