因为Canvas3D无法使用父框架动态调整大小,所以我希望能够跟踪用户何时调整窗口大小,然后自己手动调整大小。 (如果这最终导致崩溃Canvas3D,正如一些文档建议的那样,我将简单地销毁并在用户调整窗口大小时重新创建它)。此过程的一部分涉及能够准确地判断容器面板的开始程度。
我试过的两种方法:
panel.getHeight(); panel.getPreferredSize().height;
似乎没有准确报告事情:getHeight()
总是为零,而getPreferredSize()
会返回实际上与面板实际大小无关的数字。
有什么想法吗?
编辑:因此,我将调试器带到面板对象并手动检查非对象属性,但我没有看到任何类似宽度/高度的东西。当然,有一些我没看过的子对象。此外,当我查询高度/对象时,可能窗口必须是可见的(当时我正在连接对象)?
编辑2 :所以,Swing类是AWT类的子类,所以我想如果你能够找到那些的高度/宽度,那么这种方法会概括。我已相应修改了标题。
答案 0 :(得分:20)
要确定组件的大小,您需要:
通常,您可以通过getSize()方法获得组件的确切大小,该方法返回包含宽度和高度的Dimension对象,但getWidth / Height()也应该起作用。但是,如果满足两个先决条件之一,这只能起作用。如果窗口从未显示过,没有布局管理器或组件(您想知道其大小)已在窗口/容器可见后添加,则大小通常为零。
因此,要获得正确的大小,您必须使容器/框架可见(在添加组件之后)或在容器上调用validate()或doLayout()以重新计算布局,如果您在之后添加了组件最后的布局完成了。要记住的另一件事是设置并可能在容器上配置布局管理器。如果没有设置布局管理器(null),即使调用容器可见oder调用validate()也不会在其子项上设置大小。
minimumSize / preferredSize / maximumSize属性是布局管理器的提示,组件应如何调整大小,但它不必遵守它们(大多数布局管理器不这样做)。
编辑2 :在我阅读your other question关于同一主题后,我认为您应该阅读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);
}
}
答案 1 :(得分:1)
我发现如果你通过JFrame扩展,这个代码也可以用来节省时间,精力和空间。
int windowWidth = getWidth();
int windowHeight = getHeight();
我知道你已经得到了答案,但是如果你需要替代方案,那就是。