0

我试图在我的 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();
            }
        }
4

1 回答 1

4

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

那你画错了 如果你想画一堆椭圆,那么要么

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

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

我建议,最简单的方法是:

  • 给你上课ArrayList<Point>
  • 按下鼠标时添加点并调用重绘
  • paintComponent中,调用super方法,然后使用for循环遍历ArrayList。
  • 从第 1 项的点开始循环,而不是 0,然后在前一个点和当前点之间画一条线。
  • 为了变得更漂亮,您可能希望在每次按下鼠标ArrayList<ArrayList<Point>>时开始一个新的位置ArrayList<Point>,在每次发布时完成它并将其添加到整个集合中。这将允许绘制多条线。

为什么不先自己尝试一下呢?

于 2013-10-24T16:34:15.303 回答