【问题标题】:resizing from paintComponent method从 paintComponent 方法调整大小
【发布时间】:2012-10-28 01:13:28
【问题描述】:

我有这个小代码

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() 后,框架没有调整到嵌套面板的大小。我已经阅读了该主题的相关答案,但没有一个有帮助。请给我一个解决方案好吗?

【问题讨论】:

  • 尝试在paintComponent(Graphics) 中更改GUI 的状态会导致麻烦。不要这样做。

标签: java swing jpanel paintcomponent preferredsize


【解决方案1】:

pack() 被执行时,面板仍然是不可见的,它的paintComponent() 没有被执行,因此setPreferredSize() 也没有被执行。

但不要从paintComponent() 调用setPreferredSize。在paintComponent 上画画,别无其他。避免将程序逻辑放入该方法中。绘画操作应该是快速和优化的,以获得更好的性能和用户体验。有关详细信息,请参阅Performing Custom Painting

覆盖面板的getPrefferedSize(),或者至少在pack()之前执行setPrefferedSize。

另见Should I avoid the use of set[Preferred|Maximum|Minimum]Size methods in Java Swing

【讨论】:

    【解决方案2】:
        public MyPanel() {
            setPreferredSize(new Dimension(640, 480));
        }
    

    【讨论】:

    • -1 for setPreferredSize 不需要(注意:在极少数情况下可能存在这种需要:-)
    猜你喜欢
    • 1970-01-01
    • 2014-01-10
    • 2012-04-15
    • 1970-01-01
    • 2013-06-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多