如何重绘JPanel以更新图形对象的位置?

时间:2019-04-25 01:16:52

标签: java keylistener

我正在测试我正在研究的Tetris项目的KeyListener。我的主要问题是,按下键后,无法使JPanel重新绘制以更新矩形的位置。 JPanel嵌入到JFrame中,因此我不确定是否要更新面板或框架。这是代码:

public class mainBoardTest extends JPanel implements KeyListener { 
    private Rectangle rect;
    public mainBoardTest() {
    setPreferredSize(new Dimension(400, 800));
    setBackground(Color.BLACK);
}


public void init() {
    this.addKeyListener(this);
}

public void paint(Graphics g) {
    //super.paintComponent(g);
    rect = new Rectangle(0,0,50,50);
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.RED);
    g2.fill(rect);
}

@Override
public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        rect.setLocation(rect.x + 2, rect.y);
    }
    else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        rect.setLocation(rect.x - 2, rect.y);
    }
    else if (e.getKeyCode() == KeyEvent.VK_UP) {
        rect.setLocation(rect.x, rect.y - 2);
    }
    else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
        rect.setLocation(rect.x, rect.y + 2);
    }
    repaint(); //does not repaint
}

2 个答案:

答案 0 :(得分:0)

是否所有与面板和框架相关的代码?如果是的话,看起来好像缺少了一些东西。

已经有一个与按下按钮时移动对象有关的答案,这就是链接

how to move an object in a JPanel using the arrow keys

也许可以帮助您

答案 1 :(得分:0)

在paint()方法中,每次调用时都会使用默认位置创建一个新的Rectangle。它将取代您在keyPressed处理程序中所做的任何更改。