Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找“;“真正的”;Swing/AWT对象的高度/宽度_Java_Swing - Fatal编程技术网

Java 查找“;“真正的”;Swing/AWT对象的高度/宽度

Java 查找“;“真正的”;Swing/AWT对象的高度/宽度,java,swing,Java,Swing,由于Canvas3D无法随父帧动态调整大小,因此我希望能够跟踪用户调整窗口大小的时间,然后自己手动调整窗口大小。(如一些文档所建议的那样,如果最终导致Canvas3D崩溃,我将在用户调整窗口大小时销毁并重新创建它)。这个过程的一部分涉及到能够准确地说出容器面板的大小 我尝试过的两种方法: panel.getHeight(); panel.getPreferredSize().height; panel.getHeight(); panel.getPreferredSize().高度; 似乎没有准

由于Canvas3D无法随父帧动态调整大小,因此我希望能够跟踪用户调整窗口大小的时间,然后自己手动调整窗口大小。(如一些文档所建议的那样,如果最终导致Canvas3D崩溃,我将在用户调整窗口大小时销毁并重新创建它)。这个过程的一部分涉及到能够准确地说出容器面板的大小

我尝试过的两种方法:

panel.getHeight(); panel.getPreferredSize().height; panel.getHeight(); panel.getPreferredSize().高度; 似乎没有准确地报告问题:
getHeight()
总是为零,而
getPreferredSize()
返回的数字实际上与面板的实际大小无关

有什么想法吗

编辑:所以,我使用调试器对面板对象进行了调试,并手动检查了非对象属性,但没有看到任何类似宽度/高度的内容。当然,有些子对象我没有看到。另外,当我查询高度/对象时,可能窗口必须是可见的(在我连接对象时,窗口不是可见的)


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

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

  • 在某个时候手动设置它
  • 运行负责布局组件的布局管理器
通常,您可以通过getSize()方法获得组件的确切大小,该方法返回一个包含宽度和高度的维度对象,但是getWidth/height()也可以。但这只有在满足两个先决条件之一的情况下才能起作用。如果窗口从未被设置为可见,没有布局管理器,或者在窗口/容器被设置为可见后添加了组件(您想知道其大小),则大小通常为零

因此,要获得正确的大小,必须使容器/框架可见(添加组件后),或者如果在最后一次布局完成后添加组件,则必须在容器上调用validate()或doLayout()来重新计算布局。要记住的另一件事是在容器上设置并可能配置布局管理器。如果未设置布局管理器列表(null),则即使调用validate()使容器可见,也不会对其子容器设置大小

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

编辑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();
我知道你已经得到了一个答案,但如果你需要一个替代方案,就在这里