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

因为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:在我阅读your other question关于同一主题后,我认为你应该阅读Java教程中的Using Layout Managers

编辑:我不知道你是否已经知道了,但是为了对窗口的大小调整做出反应,你可以这样做:

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

}
翻译自:https://stackoverflow.com/questions/211051/find-real-height-width-of-swing-awt-object

转载注明原文:java – 找到Swing / AWT对象的“真实”高度/宽度