我正在使用JPanel(里面有几个标签)在图表上添加动态信息。这个面板是动态创建的,在我用它绘制之前它是不可见的。
为此,我使用的是BufferedImage,我遵循与此other question中描述的步骤大致相同的步骤。只要我指定所有尺寸(面板及其组件),它就可以正常工作。
在提到的问题的评论中也被问到,如何确定该面板的最佳尺寸?如果此面板以常规框架/布局设置显示,则将执行相同的操作。
在我的情况下,如何在某种程度上“打包”此面板,以便将其大小和内容大小设置为最佳(由标签大小决定)?
答案 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();