1

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

这是一个简单的示例,可以编译我正在尝试做的事情:

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() 返回宽度和高度为 0 而它显然占据了整个屏幕,即 400x300。

感谢@camickr 告诉我不应该为我的面板设置首选大小,这有助于我找出问题出在哪里。

4

2 回答 2

2

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

当您发布问题时,您需要发布您的SSCCE来证明该问题。

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

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

输入 this 和 this.getContentPane() 有区别吗

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

于 2011-07-09T06:15:29.453 回答
2

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

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

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

安慰:

java.awt.Dimension[宽度=0,高度=0]
java.awt.Dimension[宽度=160,高度=30]
于 2011-07-09T08:08:00.977 回答