繁体   English   中英

Java-如何从 JPanel 中清除图形

[英]Java- how to clear graphics from a JPanel

我正在创建一个简单的程序,在其中绘制一个黑色椭圆形,然后用鼠标单击。 但是,我希望出现一个新的椭圆形,而旧的椭圆形消失。 我该怎么做呢? 我把 removeAll() 方法插入到我的 mousePressed 方法中,但它对我不起作用。 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) {       
    }
}

如果您只想显示新创建的椭圆,一种可能的解决方法。 使您的框架和面板保持静态,然后在 mousePressed 中调用 frame.setContentPane(panel)。

另一种工作方法是在油漆中调用 g.clearRect(0, 0, getWidth(), getHeight()) ,但这会使整个背景变白。

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

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

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

Javadoc 解释了绘制机制

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

  • 公共空心漆(图文g)

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

  • protected void paintComponent(Graphics g)
  • 受保护的无效paintBorder(图形g)
  • protected void paintChildren(Graphics 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);
}  

此外,您不需要在mousePressed(MouseEvent e)方法中调用removeAll()

    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        repaint();     
    }
  1. 由于 JPanel 是 JComponent 的子类,因此您应该覆盖paintComponent而不是paint并在paintComponent方法中使用super.paintComponent(g)

     @Override public void paintComponent(Graphics g) { super.paintComponent(g);
  2. 当您使用removeAll ,JPanel 中的所有组件(按钮、文本字段、标签等)都会被删除,如果有的话。 但是,您似乎没有向 JPanel 添加任何组件,因此没有必要调用此方法。

只用当前绘图表面的背景颜色填充椭圆

 {
        g.setColor(...);//setColor to  surface background 
        g.fillOval(x, y, 50, 50);
    }

如果您愿意,您可以清除该区域: OracleDoc 上的更多信息

g.clearRect(pos, pos, size, size);

有同样的问题并找到了这个解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM