Java 单击鼠标后绘制椭圆形

Java 单击鼠标后绘制椭圆形,java,swing,graphics,paintcomponent,Java,Swing,Graphics,Paintcomponent,我想在面板中单击鼠标时绘制一个椭圆形。我点击按钮后可以画图。但是出现了一个问题:按钮的副本绘制在面板的左上角 这是我的代码: public class PaintPanel extends JPanel implements MouseListener, MouseMotionListener{ private boolean draw = false; private JButton button; private Point myPoint

我想在面板中单击鼠标时绘制一个椭圆形。我点击按钮后可以画图。但是出现了一个问题:按钮的副本绘制在面板的左上角

这是我的代码:

 public class PaintPanel extends JPanel implements MouseListener, MouseMotionListener{

        private boolean draw = false;
        private JButton button;
        private Point myPoint;
        public PaintPanel(){
            this.setSize(800,600);
            button = new JButton("Allow draw");
            button.setSize(30,30);
            this.add(button);
            this.addMouseListener(this);
            this.addMouseMotionListener(this);
            button.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    draw = true;

                }
            });
        }
        @Override
        public void paintComponent(Graphics g){
            g.setFont(new Font("Arial",Font.BOLD,24));
            g.setColor(Color.BLUE);
            if(draw){
                g.drawOval(myPoint.x-10, myPoint.y-10, 20, 20);
            }
        }
        @Override
        public void mousePressed(MouseEvent e) {
            if(draw){
                myPoint = e.getPoint();
                repaint();
            }
        }
        public static void main(String[] agrs){
            JFrame frame = new JFrame("Painting on panel");
            frame.add(new PaintPanel());
            frame.setVisible(true);
            frame.setSize(800,600);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
        }
    }

你把油漆链弄断了

在进行任何自定义绘制之前,添加
super.paintComponent(g)

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setFont(new Font("Arial",Font.BOLD,24));
    g.setColor(Color.BLUE);
    if(draw){
        g.drawOval(myPoint.x-10, myPoint.y-10, 20, 20);
    }
}
图形
是一种共享资源。它提供给在给定绘制周期内绘制的所有内容,这意味着,除非您首先清除它,否则它将包含在您之前已经绘制的其他内容

paintComponent
的工作之一是为绘制准备
Graphics
上下文,但要清除它(用组件背景色填充)


仔细观察,了解更多细节

你打破了油漆链

在进行任何自定义绘制之前,添加
super.paintComponent(g)

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setFont(new Font("Arial",Font.BOLD,24));
    g.setColor(Color.BLUE);
    if(draw){
        g.drawOval(myPoint.x-10, myPoint.y-10, 20, 20);
    }
}
图形
是一种共享资源。它提供给在给定绘制周期内绘制的所有内容,这意味着,除非您首先清除它,否则它将包含在您之前已经绘制的其他内容

paintComponent
的工作之一是为绘制准备
Graphics
上下文,但要清除它(用组件背景色填充)

请仔细查看和了解更多详细信息


我想画画。普雷维奥斯椭圆不会消失

有关进行增量绘制的两种常用方法,请参见:

  • 保留要绘制的所有对象的列表,然后在组件的paintComponent()方法中遍历该列表
  • 使用BuffereImage并在BuffereImage上绘制对象,然后仅在paintComponent()方法中绘制BuffereImage

  • 我想画画。普雷维奥斯椭圆不会消失

    有关进行增量绘制的两种常用方法,请参见:

  • 保留要绘制的所有对象的列表,然后在组件的paintComponent()方法中遍历该列表
  • 使用BuffereImage并在BuffereImage上绘制对象,然后仅在paintComponent()方法中绘制BuffereImage

  • 我想画画。previos oval不会将它们添加到某种
    列表中,并在调用
    paintComponent
    时重新绘制它们。在Swing中绘制是一个破坏性的过程,这就是API的工作方式,您需要在其中工作。“我想绘制append.previos oval不会消失”@HjepJga_94关于程序员关于
    列表的观点,请参见
    @HjepJga_94,因为我想画一个附加。previos oval不会将它们添加到某种
    列表中,并在调用
    paintComponent
    时重新绘制它们。在Swing中绘制是一个破坏性的过程,这就是API的工作方式,您需要在其中工作。“我想绘制append.previos oval不会消失”@HjepJga_94关于程序员关于Swing应用程序的
    列表的观点,请参见。有关更多详细信息,请参阅。Swing应用程序应该从EDT运行。有关更多详细信息,请参阅。