在JPanel中调用super.paintComponent(g)之后,先前的绘图会丢失

时间:2012-04-14 12:24:00

标签: java swing

我正在尝试使用Swings构建PaintBrush。我想在其中一个JPanel上进行自由手绘,所以我覆盖了它的PaintComponent,并绘制了一些东西,它很好。但我没有得到任何背景,我需要白色背景,所以我在paintComponent()中调用了super.paintComponent(g),现在我能够获得背景,但每次我的repaint()都在mouseDragged事件上调用,我丢失我以前在JPanel上的绘图。  有什么方法可以获得背景颜色,而且我以前的绘图也没有丢失?

任何帮助都将不胜感激。谢谢

JPanel paintComponent()

public void paintComponent(Graphics g) {
        // super.paintComponent(g);
      g.setColor(Color.red);
      g.fillOval(xpos, ypos, 5, 5);

    }

的mouseDragged()

public void mouseDragged(MouseEvent arg0) {
        xpos= arg0.getX();
         ypos= arg0.getY();
         repaint();
            }

1 个答案:

答案 0 :(得分:2)

如果使用通过在组件上调用getGraphics()获得的Graphics对象进行绘制,通常会发生这种情况,因为这样获得的Graphics对象不是持久的。所有绘图都应该在paintComponent中或从paintComponent调用的方法中完成。

修改
好的,谢谢您发布一些代码。所以我看到你在代码中只绘制了一个椭圆形,所以super会阻止你画一条线就不足为奇了。

可能的解决方案:

  • mouseDragged(...)方法中,将点数添加到List<Point>并在paintComponent(...)方法中,迭代绘制线条的列表(设置Graphics2D笔划以更改线条粗细)
  • 或绘制到BufferedImage并在paintComponent(...)方法中显示BufferedImage。

例如,请查看我的StackOverflow对此问题的回答:Changing JPanel Graphics g color drawing line