如何从构造函数中获取 JPanel 的宽度和高度?

How can I get a JPanel's width and height from within the constructor?

所以我有一个 class 可以将内容绘制到 JPanel,但为此我需要在构造函数中实例化多边形。但是我现在有点困惑;我创建了 JFrame 并像这样添加了扩展 class "Field" 的 JPanel,

public class mainSetup {
    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setSize(600,600);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.add(new Field());
        frame.pack();
    }

}

这是 JPanel 的代码:

public class Field extends JPanel implements ActionListener{
    public Field(){

        System.out.println(getWidth());
    }
    @Override
    public void paintComponent(Graphics g){
        System.out.println(getWidth());
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        repaint();

    }


}

为什么在构造函数中调用getWidth() 打印0 而在paintComponent 方法中调用getWidth() returns 594?事实上 - 为什么这些数字中的任何一个都不是我期望的 600?为什么它们会有所不同?

swing 组件在构建时还没有宽度。首先必须将其添加到容器中,之后布局管理器将为组件分配位置和尺寸。

至于为什么不是 600 而是 594 - 每个摆动组件都有 "insets" 被边框占用。它们有一个默认宽度,具体取决于您的 PLAF。在这种情况下,JFrame 内容窗格左侧和右侧的插图可能是 3 和 3 个像素,加起来为 6,并且 600 - 6 = 594.

JPanel默认的LayoutManager是BorderLayout,组件的大小在BorderLayout.layoutContainer中计算,调用构造函数时,BorderLayout.layoutContainer没有调用;