Swing - JPanel背景颜色消失

时间:2013-10-24 16:31:46

标签: java swing jpanel paintcomponent mouse-listeners

我正在尝试在我的JPanel中绘制,但每次单击时,我的JPanel的背景都会消失。它绘制了鼠标所在的一条线。我认为它与2D图形有关 有人可以帮忙吗?

public Brush() {

addMouseListener(this);
    addMouseMotionListener(this);
    setBackground(Color.white);


 }
    @Override
    public void paintComponent(Graphics g) {

        Graphics2D g2;
       // super.paintComponent(g);

        g2 = (Graphics2D) g;

        g2.setColor(brushColor);
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
        //Ellipse2D.Double circle = new Ellipse2D.Double(p1.x,p1.y,20,20);

        g2.fillOval(p1.x,p1.y,20,20);

        }


        @Override
        public void mousePressed(MouseEvent e) {
            dragging = true;
            p1 = e.getPoint();
            repaint();
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            dragging = false;
            p1 = e.getPoint();
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if (dragging) {
                p1 = e.getPoint();
                repaint();
            }
        }

1 个答案:

答案 0 :(得分:4)

始终在覆盖范围内调用super.paintComponent(g)方法。

你错了。如果你想绘制一堆椭圆形,那么

  • 创建它们的集合,并在paintComponent或
  • 中使用for循环绘制它们
  • 在BufferedImage中绘制它们,然后在paintComponent方法中绘制。
  • 如果我想用鼠标绘制曲线,我通常会创建一个ArrayList<Point>并在paintComponent或BufferedImage中的连续点之间绘制线条。

同样,您的代码编写为在paintComponent中仅绘制一个点(实际上是椭圆形)。如果编码正确,就可以做到这一点。

我建议,最简单的事情是:

  • 为您上课ArrayList<Point>
  • 按下鼠标时添加点并调用重绘
  • paintComponent中,调用super方法,然后使用for循环遍历ArrayList。
  • 在项目1处的Point处开始循环,而不是0,然后在上一个Point和当前点之间画一条线。
  • 为了获得更好的体验,您可能希望拥有一个ArrayList<ArrayList<Point>>,每按一次鼠标就会开始一个新的ArrayList<Point>,每次发布都会完成它并将其添加到整个集合中。这将允许绘制几行。

为什么不先自己动手呢?