如何根据内容找出未显示的JPanel的首选大小?

时间:2010-02-09 09:05:27

标签: java swing jpanel

我正在使用JPanel(里面有几个标签)在图表上添加动态信息。这个面板是动态创建的,在我用它绘制之前它是不可见的。

为此,我使用的是BufferedImage,我遵循与此other question中描述的步骤大致相同的步骤。只要我指定所有尺寸(面板及其组件),它就可以正常工作。

在提到的问题的评论中也被问到,如何确定该面板的最佳尺寸?如果此面板以常规框架/布局设置显示,则将执行相同的操作。

在我的情况下,如何在某种程度上“打包”此面板,以便将其大小和内容大小设置为最佳(由标签大小决定)?

2 个答案:

答案 0 :(得分:3)

Suraj和willcodejavaforfood让我走上了良好的轨道。

检查pack()方法实际执行的操作,我发现这主要是将当前大小设置为getPreferredSize()返回的大小。

由此,我设法做出了这样的解决方案:

// Creating the panel
JPanel lPanel = new JPanel();
//lPanel.setSize(1000, 1000); //default size, not needed anymore
lPanel.setLayout(new BoxLayout(lPanel, BoxLayout.PAGE_AXIS));

//Adding the content
lPanel.add(new JLabel("Blah"));
// etc...

//Adjust the panel to its preferred size
lPanel.setSize(lPanel.getPreferredSize());

//Call the layout method 
//(this will adjust the content components to their correct size and position)
lPanel.doLayout();

此方法正常运行,并将面板及其内容调整为正确的大小(并以简单的方式回答我的问题:“如何找到首选大小?getPreferredSize()”。

但是,它需要将初始大小设置为足够大的大小,以便内容适合,或者不会将它们放在布局上。这有点可惜,并不是真的“干净”,但我现在找不到办法避免这种情况。

修改实际上,默认大小不是必需的,因为getPreferredSize()会返回正确的值,即使在调用doLayout()之前也是如此。因此,在调用布局方法之前,可以将面板设置为适当的大小。

答案 1 :(得分:1)

直接回答是致电Window#pack()。此方法将自动将所有基础子项的大小设置为其首选大小(当然这取决于子容器的布局,例如BorderLayout doesent给出了有关优先大小的内容)。

因此,只要您设置了子组件的首选大小(或者布局类似于BorderLayout的最小/最大大小),就可以使用pack()方法。

[更新]
一种方法是在您的jpanel中添加HierarchyListener并检查HierarchyEvent#DISPLAYABILITY_CHANGED个事件。当您的面板已经准备好显示(并且父级可用)时,将调用此事件,此时您可以执行此操作:

SwingUtilities#getWindowAncestor(myPanel).pack();