Java-如何从JPanel清除图形

ano*_*oob 5 java swing java-2d jpanel

我正在创建一个简单的程序,在其中绘制一个黑色椭圆形,然后用鼠标单击。但是,我希望出现一个新的椭圆形,而一个旧的椭圆形消失。我将如何去做呢?我弄乱了在mousePressed方法中插入的removeAll()方法,但是它对我不起作用。removeAll()方法是否甚至适用于此?还是我应该使用其他东西?抱歉,答案很明显,但是我对此还很陌生,正在尝试学习。任何建议将不胜感激。谢谢。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintPractice extends JPanel implements MouseListener {

    Random rand = new Random(); 
    int x = rand.nextInt(450);
    int y = rand.nextInt(450);

    public PaintPractice(){
        super();
        addMouseListener(this);
    }

    public static void main(String[] args){

        JFrame frame = new JFrame();
        PaintPractice panel = new PaintPractice();

        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(panel);        
    }

    public void paint(Graphics g){
        g.setColor(Color.BLACK);
        g.fillOval(x, y, 50, 50);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        removeAll();
        repaint();      
    }

    @Override
    public void mouseClicked(MouseEvent e) {        
    }

    @Override
    public void mouseEntered(MouseEvent e) {        
    }

    @Override
    public void mouseExited(MouseEvent e) {     
    }

    @Override
    public void mouseReleased(MouseEvent e) {       
    }
}
Run Code Online (Sandbox Code Playgroud)

MCh*_*ker 4

立即解决它只需调用super.paint(g)方法paint(Graphics g)即可。

public void paint(Graphics g){
        super.paint(g);
        g.setColor(Color.BLACK);
        g.fillOval(x, y, 50, 50);
    }
Run Code Online (Sandbox Code Playgroud)

绘制机制以及为什么我应该覆盖paintComponent()而不是覆盖paint()

Javadoc 解释了Paint 机制

现在您知道 PaintComponent 方法是所有绘画代码应该放置的地方。确实,当需要绘制时,会调用此方法,但绘制实际上是从类层次结构的更高层开始的,即使用 Paint 方法(由 java.awt.Component 定义)。无论何时,绘制子系统都会执行此方法。您的组件需要渲染。它的签名是:

  • 公共虚空涂料(图形g)

javax.swing.JComponent 扩展了此类,并将 Paint 方法进一步分解为三个单独的方法,这些方法按以下顺序调用:

  • protected void PaintComponent(图形g)
  • protected void PaintBorder(图形g)
  • protected void PaintChildren(图形 g)

该 API 不会阻止您的代码重写 PaintBorder 和 PaintChildren,但一般来说,您没有理由这样做。出于所有实际目的,paintComponent 将是您需要重写的唯一方法

这就是为什么您的PaintPractice代码应该调用super.paintComponent(g)

public void paintComponent(Graphics g) {    
    super.paintComponent(g);       
     g.setColor(Color.BLACK);
     g.fillOval(x, y, 50, 50);
}  
Run Code Online (Sandbox Code Playgroud)

而且您不需要调用removeAll()mousePressed(MouseEvent e)方法。

    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        repaint();     
    }
Run Code Online (Sandbox Code Playgroud)