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)
立即解决它只需调用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)