Java 绘制对象不';按此键后,无法清除上一个矩形

Java 绘制对象不';按此键后,无法清除上一个矩形,java,swing,jframe,paint,keylistener,Java,Swing,Jframe,Paint,Keylistener,我的代码不会清除上一个矩形。我认为通过使用getRect()然后在我的keyPressed()方法中使用repaint()可以解决这个问题 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.

我的代码不会清除上一个矩形。我认为通过使用getRect()然后在我的keyPressed()方法中使用repaint()可以解决这个问题

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;


public class Rectangle extends JFrame 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();


    setSize(1000,1000);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);


    label.addKeyListener(this);
    label.setFocusable(true);
    label.setOpaque(true);
    label.addKeyListener(this);
    this.add(label);
    setVisible(true);
    label.requestFocusInWindow();

}


public void keyPressed(KeyEvent e)
{   

    if (e.getKeyCode() == KeyEvent.VK_DOWN)
    {
        g2.clearRect(x, y, width, height);
        repaint();
        y = y + 5;
        repaint();
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT)
    {
        g2.clearRect(x, y, width, height);
        repaint();
        x = x - 5;
        repaint();
    }
    if (e.getKeyCode() == KeyEvent.VK_UP)
    {
        g2.clearRect(x, y, width, height);
        repaint();
        y = y - 5;
        repaint();
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
    {
        g2.clearRect(x, y, width, height);
        x = x + 5;
        repaint();
    }
}


public void keyReleased(KeyEvent e) {}

public void keyTyped(KeyEvent e) {}




public void paint(Graphics g) {

    g2 = (Graphics2D) g;
    g2.drawRect(x, y, width, height);

}

}
试验方法:

public class Test {

public static void main(String[] args)
{
    Rectangle rectangle = new Rectangle(400,200,500,500);

}
}
你能补充一下细节吗? 从我所看到的,你可能想明确一个按钮和方法

  • setVisible(true)
    应该是公共
    矩形(…
    )中的最后一行代码,因为您将
    JComponent
    添加到了已经可见的Swing GUI中

  • 默认情况下,
    JFrame
    对于
    KeyEvent
    不可聚焦

  • JPanel
    放置到
    JFrame
    中心
    区域,默认情况下:
    myFrame.add(myPanel)

  • JPanel
    覆盖
    getPreferredSize
    ,而不是为
    JFrame
    size设置;应通过调用
    myFrame.pack()
    初始化大小

  • JPanel
    必须可聚焦以接收
    KeyEvent
    setFocusable(true)
    ;使用键绑定而不是在
    JComponent
    层次结构中搜索焦点

  • 覆盖
    JPanel的
    paintComponent
    ;第一行代码应该是
    super.paintComponent
    ,否则会出现绘制瑕疵


  • 问题是,我不想用按钮清除矩形,而是当我按下箭头键时。如果我按下向上键,我希望矩形向上移动并清除上一个矩形。这有帮助吗?哦,矩形是否重复自身?不要覆盖绘制并直接在JFrame上绘制。而是使用添加到JFrame的JPanel。请看本教程:。另外,您是否可以发布当前正在发生的不受欢迎的事情的图像?