为什么这个Java绘图程序不会绘制多个椭圆?

use*_*233 0 java swing repaint paintcomponent

我有一个Java绘图程序,它使用自定义JPanel进行绘制.当点击JPanel时会画一个小椭圆(或圆圈,如果你愿意的话),每当你点击另一个地方时,椭圆会消失.坐标也会更新,但椭圆不会停留,它会移动到用户点击下一个位置...这是自定义JPanel的代码:

int xCord, yCord;

    public class PaintPanel extends JPanel implements MouseListener {
        // default serial whatever...
        private static final long serialVersionUID = -6514297510194472060L;

        // initial values
        int xCord = -10;
        int yCord = -10;

        public PaintPanel() {
            addMouseListener(this);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(ProgramUI.currentColor);
            g.fillOval(xCord, yCord, 8, 8);
            repaint();
        }

        @Override
        public void mouseClicked(MouseEvent m) {
        }

        @Override
        public void mouseEntered(MouseEvent m) {
        }

        @Override
        public void mouseExited(MouseEvent m) {
        }

        @Override
        public void mousePressed(MouseEvent m) {
            if (paintPanel.contains(m.getPoint())) {
                xCord = m.getX();
                yCord = m.getY();
                System.out.println("x: " + xCord + " y: " + yCord);
            }
        }

        @Override
        public void mouseReleased(MouseEvent m) {
        }

    }
Run Code Online (Sandbox Code Playgroud)

我需要握住鼠标来连续画椭圆形,直到鼠标按钮松开.这里唯一的问题是鼠标椭圆更新,但不保存它的原始位置.我该如何解决?

Rei*_*eus 5

fillOval绘制了一个椭圆,因为在paintComponent方法中只有一个语句绘制一个椭圆,因此声明

super.paintComponent(g);
Run Code Online (Sandbox Code Playgroud)

导致任何先前的绘画在被repaint调用时被清除.

要绘制多个椭圆,您可以从自定义绘画方法中List<Point>概述的绘制组件

不要repaint从内部打电话paintComponent.这会产生无限循环并降低性能.如果需要定期更新调用repaintActionListener一个的摇摆定时器来代替.