不能在JPanel上绘制椭圆形

时间:2012-12-27 14:55:12

标签: java swing jpanel java-2d paintcomponent

我有一个使用Netbeans的GUI构建器创建的JFrame,它只包含一个JPanel。我创建了一个方法getPanel来获取对这个JPanel的引用:

public class ShowDrawings extends JFrame {

    public ShowDrawings() {
        initComponents();
    }

    public JPanel getPanel(){
        return panel;
    }

    private JPanel panel;
}

在我的主要功能中:

public class Main {
    public static void main(String[] args){
        ShowDrawings sd = new ShowDrawings();
        sd.setSize(800, 600);
        Graphics g = sd.getPanel().getGraphics();
        g.setColor(Color.BLACK);
        g.drawOval(400, 300, 50, 50);
        sd.getPanel().paint(g);
        sd.repaint();
        sd.setVisible(true);
    }
}

但它没有任何吸引力。请帮我。 我查看了一些相关问题,但他们都建议扩展JPanel并覆盖其paint方法。但我不想这样做。 感谢。

2 个答案:

答案 0 :(得分:5)

  

我看了一些相关的问题,但他们都在暗示   扩展JPanel并覆盖其paint方法。但我不想要   这样做

您不应该覆盖JPanel paint()方法,而应覆盖paintComponent(..)。这是最佳实践,如果您希望代码不会产生异常,则应该这样做。在你当前的方法中做到这一点(正如你所看到的那样)使得创建持久性绘图变得更加困难,因为它们在repaint()上消失了

相反延伸JPanel并覆盖paintComponent(Graphics g),并且忘记在重写的super.paintComponent(g)方法中调用paintComponent(..)作为第一次调用。另外,请不要忘记覆盖getPreferredSize()的{​​{1}},以便我们可以返回正确的维度,JPanel可以调用pack()(+1到@mKorbels评论):

以下是一些示例代码:

enter image description here

JFrame

答案 1 :(得分:3)

第一次repaint() ShowDrawings sd帧时,您所绘制的任何内容(sd.getPanel().getGraphics().drawOval(...))都会被原始JPanel#paintComponent()方法删除。

作为Andrew Thompson has written

  

不要使用Component.getGraphics()。相反,子类化并覆盖paint()(AWT)或paintComponent()(Swing)方法。

     

Component.getGraphics()根本无法工作。 Java使用回调机制绘制图形。您不应该使用getGraphics()将图形信息“推送”到组件中。相反,您应该等到Java调用 paint()/ paintComponent()方法。那时你应该为Component提供你想要的图纸。

如果您只是检查/调试某些内容,您甚至可以执行以下操作:

class Test {
    private JPanel panel = new JPanel() {
        public void paintComponent(Graphics g) {
             g.setColor(Color.BLACK);
             g.drawOval(400, 300, 50, 50);
        }
    };
}