[英]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();
}
由于 JPanel 是 JComponent 的子类,因此您应该覆盖paintComponent
而不是paint
并在paintComponent
方法中使用super.paintComponent(g)
。
@Override public void paintComponent(Graphics g) { super.paintComponent(g);
当您使用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.