9

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

我试过的两种方法:

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

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

有任何想法吗?

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

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

4

2 回答 2

21

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

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

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

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

}
于 2008-10-17T04:41:56.820 回答
1

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

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

我知道您已经得到了答案,但如果您需要替代方案,这里就是。

于 2012-06-28T20:49:24.257 回答