查找Swing / AWT对象的“实际”高度/宽度

杨爱德:

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

我尝试过的两种方法:

panel.getHeight(); 
panel.getPreferredSize()。height;

似乎无法准确地报告情况:getHeight()始终为零,并getPreferredSize()返回与面板的实际大小实际上没有任何关系的数字。

有任何想法吗?

编辑:因此,我将调试器带到面板对象上,并手动检查了非对象属性,但没有看到任何类似于宽度/高度的内容。当然,有一些我没有看过的子对象。另外,当我查询高度/对象时,也许窗口必须是可见的(在我与对象交接的那一点不是)?

编辑2:因此,Swing类是AWT类的子类,因此我想如果您能够找到这些类的高度/宽度,则该方法将是通用的。我已经相应地修改了标题。

西蒙·莱曼:

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

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

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

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

minimumSize / preferredSize / maximumSize属性是布局管理器的提示,组件的大小应如何设置,但不必遵循(大多数布局管理器都不需要)。

编辑2:阅读完有关同一主题的其他问题之后,我认为您应该阅读The Java Tutorials中的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);
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章