Java 从paintComponent方法调整大小

Java 从paintComponent方法调整大小,java,swing,jpanel,paintcomponent,preferredsize,Java,Swing,Jpanel,Paintcomponent,Preferredsize,我有这个小代码 public class Test extends JFrame { public static void main(String[] args) { new Test(); } Test() { getContentPane().add(new MyPanel()); pack(); setVisible(true); } private class MyPanel extends JPanel { @Override

我有这个小代码

public class Test extends JFrame {

public static void main(String[] args) {
    new Test();
}

Test() {
    getContentPane().add(new MyPanel());

    pack();
    setVisible(true);
}

private class MyPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        setSize(640, 480);
        setPreferredSize(new Dimension(640, 480));
        setMinimumSize(new Dimension(640, 480));
        g.fillRect(20, 20, 50, 50);
    }

}
不幸的是,调用
pack()
后,框架的大小未调整为嵌套面板的大小。我已经阅读了这个主题的相关答案,但没有一个有帮助。您能给我一个解决方案吗?

当执行
pack()
时,面板仍然不可见,其
paintComponent()
未执行,因此
setPreferredSize()
也未执行

    public MyPanel() {
        setPreferredSize(new Dimension(640, 480));
    }
但是不要从
paintComponent()
调用
setPreferredSize
。在
paintComponent
中进行绘制,无需其他操作。避免将程序逻辑放入该方法中。喷漆操作应快速且优化,以获得更好的性能和用户体验。有关更多详细信息,请参阅

覆盖面板的
getPreferedSize()
,或者至少在
pack()
之前执行setPreferedSize


另见

试图在
paintComponent(Graphics)
中更改GUI的状态将导致故障。不要这样做。-1表示无需设置PreferredSize(注意:在极少数情况下可能存在这种需要:-)