当我按下其中一个箭头键时,我的代码不会清除上一个矩形。我认为在我的keyPressed()
方法中使用repaint()
可以解决问题。我也尝试使用clearRect()
,但是这没有任何作用。按下键后,我绘制的对象没有清除上一个矩形
这是空闲矩形:
这是当我按住右箭头键:
这里是我的代码:
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
import javax.swing.Icon;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Arc2D;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Rectangle extends JPanel implements KeyListener{
private int height;
private int width;
private int x;
private int y;
private Graphics2D g2;
public Rectangle(int width, int height,int x, int y)
{
this.height = height;
this.width = width;
this.x = x;
this.y = y;
JLabel label = new JLabel();
label.addKeyListener(this);
label.setFocusable(true);
label.setOpaque(true);
label.addKeyListener(this);
this.add(label);
label.requestFocusInWindow();
setVisible(true);
}
public Dimension getPreferredSize() {
return new Dimension(500,500);
}
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_DOWN)
{
y = y + 5;
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_LEFT)
{
x = x - 5;
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_UP)
{
y = y - 5;
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT)
{
x = x + 5;
repaint();
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
public void paintComponent(Graphics g) {
this.g2 = (Graphics2D) g;
g2.drawRect(x, y, width, height);
}
}
测试类
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
JFrame f = new JFrame("Rectangle");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new Rectangle(40,20,250,250));
f.pack();
f.setVisible(true);
}
}