由于Canvas3D无法使用父框架动态调整大小,因此我希望能够跟踪用户何时调整窗口大小,然后自己手动调整大小.(如果这最终导致崩溃Canvas3D,正如一些文档建议的那样,当用户调整窗口大小时,我将简单地销毁并重新创建它).此过程的一部分涉及能够准确地判断容器面板的开始程度.
我试过的两种方法:
panel.getHeight(); panel.getPreferredSize().height;
似乎没有准确报告事物:getHeight()
总是为零,并getPreferredSize()
返回实际上与面板的实际大小无关的数字.
有任何想法吗?
编辑:所以,我把一个调试器带到面板对象并手动检查非对象属性,我没有看到任何类似宽度/高度的东西.当然,有一些我没看过的子对象.此外,当我查询高度/对象时,可能窗口必须是可见的(它不是,当我正在连接对象时)?
编辑2:所以,Swing类是AWT类的子类,所以我想如果你能够找到那些的高度/宽度,那么这种方法会概括.我相应地修改了标题.
要确定组件的大小,您必须:
在某些时候手动设置它
运行负责布局组件的布局管理器
通常,您通过getSize()方法获得组件的确切大小,该方法返回包含宽度和高度的Dimension对象,但getWidth/Height()也应该起作用.但是,如果满足两个先决条件之一,这只能起作用.如果窗口从未显示过,没有布局管理器或组件(您想知道其大小)已在窗口/容器可见后添加,则大小通常为零.
因此,要获得正确的大小,您必须使容器/框架可见(在添加组件之后)或在容器上调用validate()或doLayout()以重新计算布局,如果您在最后一个布局后添加了组件已经完成.要记住的另一件事是设置并可能在容器上配置布局管理器.如果没有设置布局管理器(null),即使调用容器可见oder调用validate()也不会在其子项上设置大小.
minimumSize/preferredSize/maximumSize属性是布局管理器的提示,组件应如何调整大小,但不必遵守它们(大多数布局管理器不这样做).
编辑2:在我阅读了关于同一主题的其他问题之后,我认为您应该阅读使用 Java教程中的布局管理器
编辑:我不知道你是否已经知道了,但为了对窗口的大小调整作出反应,你可以这样做:
public class WindowResizeTest extends JFrame { public static void main(String[] args) { new WindowResizeTest(); } public WindowResizeTest() { this.setSize(640, 480); JPanel panel = new JPanel(); panel.setBackground(Color.RED); this.add(panel); this.addComponentListener(new ComponentListener() { public void componentResized(ComponentEvent e) { System.out.println(e.getComponent().getSize()); } public void componentHidden(ComponentEvent e) {} public void componentMoved(ComponentEvent e) {} public void componentShown(ComponentEvent e) {} }); this.setVisible(true); } }