我想我解决了我的问题,但是我不知道为什么它是这样工作的,所以我希望有人能给我解释一下,这样我以后就不会再犯同样的错误了。
这里有一个快速的示例,可以编译我正在尝试做的事情:
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告诉我我不应该为我的面板设置一个preferredSize,这帮助我找出问题是从哪里来的
为什么[]
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) 很难说为什么你的代码不工作,因为你没有发布你的代码。几行随机的代码并不能告诉我们代码在你的程序中是如何使用的。
当你发布问题时,你需要发布演示问题的SSCCE。
胶水不应该解决这个问题。面板应该仍然显示,只是它可能不会显示在您期望的位置。BoxLayout将尝试调整添加到它的组件的大小,以填满它可用的整个空间。
你不应该在面板上使用setPreferredSize()布局管理器的工作是根据添加到面板中的所有组件的首选大小计算面板的首选大小。所以我认为你的代码仍然是错误的。
输入this和this. getcontentpane()有区别吗
某些方法调用被自动转发到框架的内容窗格,这就是为什么最终结果是相同的。阅读JFrame API。这在API描述或相关方法中得到了解决。