找到Swing / AWT对象的“真实”高度/宽度

因为Canvas3D无法使用父框架动态resize,所以我希望能够跟踪用户何时调整窗口大小,然后自己手动resize。 (如果这最终导致崩溃Canvas3D,正如一些文档建议的那样,当用户调整窗口大小时,我将简单地销毁并重新创建它)。 此过程的一部分涉及能够准确地判断容器面板的开始程度。

我试过的两种方法:

  panel.getHeight();
 。panel.getPreferredSize()高度; 

似乎没有准确报告事物: getHeight()总是为零,而getPreferredSize()返回的数字实际上与面板的实际大小无关。

有任何想法吗?

编辑 :所以,我把一个调试器带到面板对象并手动检查非对象属性,我没有看到任何类似宽度/高度的东西。 当然,有一些我没看过的子对象。 此外,当我查询高度/对象时,可能窗口必须是可见的(当我正在连接对象时)

编辑2 :所以,Swing类是AWT类的子类,所以我想如果你能够找到那些的高度/宽度,那么这个方法就会概括。 我已相应修改了标题。

要确定组件的大小,您必须:

  • 在某些时候手动设置它
  • 运行负责布局组件的布局管理器

通常,您通过getSize()方法获得组件的确切大小,该方法返回包含宽度和高度的Dimension对象,但getWidth / Height()也应该起作用。 但是,如果满足两个先决条件之一,这只能起作用。 如果窗口从未显示过,没有布局管理器或组件(您想知道其大小)已在窗口/容器可见后添加,则大小通常为零。

因此,要获得正确的大小,您必须使容器/框架可见(在添加组件之后)或在容器上调用validate()或doLayout()以重新计算布局,如果您在最后一个布局后添加了组件已经完成。 要记住的另一件事是设置并可能在容器上配置布局管理器。 如果没有设置布局管理器(null),即使调用容器可见oder调用validate()也不会在其子项上设置大小。

minimumSize / preferredSize / maximumSize属性是布局管理器的提示,组件应如何resize,但不必遵守它们(大多数布局管理器不这样做)。

编辑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); } } 

我发现如果你扩展JFrame,这个代码也可以用来节省时间,精力和空间。

 int windowWidth = getWidth(); int windowHeight = getHeight(); 

我知道你已经得到了答案,但如果你需要另一种选择,那么它就是。