【问题标题】:Find "real" height/width of Swing/AWT object查找 Swing/AWT 对象的“真实”高度/宽度
【发布时间】:2010-09-17 16:26:08
【问题描述】:

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

我试过的两种方法:

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

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

有什么想法吗?

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

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

【问题讨论】:

    标签: java swing


    【解决方案1】:

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

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

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

    因此,要获得正确的大小,您必须使容器/框架可见(在添加组件之后)或在容器上调用 validate() 或 doLayout() 以重新计算布局,如果您在之后添加了组件最后的布局已经完成。要记住的另一件事是在容器上设置并可能配置布局管理器。如果没有设置布局管理器(null),即使使容器可见或调用 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);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

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

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

      我知道您已经得到了答案,但如果您需要其他选择,这里就是。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-30
        • 2016-07-20
        • 2021-05-09
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-14
        相关资源
        最近更新 更多