【问题标题】:How to move a Rectangle with arrow keys?如何用箭头键移动矩形?
【发布时间】:2015-07-26 02:00:20
【问题描述】:

我有一个框架,它是一个矩形。 如果单击箭头键,我想知道如何将矩形移入。 我搜索了一些示例,但没有任何效果(很奇怪,因为它应该是一件简单的事情)

这是我的 Rectangle 类:

 public class PlayerOne implements KeyListener {

    int x,y;
    public PlayerOne(JPanel panel){
        this.x = panel.getWidth()/2;
        this.y = panel.getHeight()/2;
    }

    public void paint(Graphics g){
        g.setColor(Color.RED);
        g.fillRect(125, 480, 60, 10);
    }

    @Override
    public void keyPressed(KeyEvent arg0) {
        // TODO Auto-generated method stub
        int keyCode = arg0.getKeyCode();
        if(keyCode == arg0.VK_KP_RIGHT){
            this.x+=5;
        }
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub          
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub          
    }    
}

这是主要的:

public class PingPong extends JPanel {

    private static final long serialVersionUID = -4170574729049260633L;

    //Initialize
    Table table = new Table();
    PlayerOne po = new PlayerOne(this);

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        table.paint(g);
        po.repaint(g);
    }

    public static void main(String[] args){
        JFrame frame = new JFrame();            
        frame.setTitle("Pong");
        frame.setSize(326, 533);
        frame.add(new PingPong()).setBackground(Color.DARK_GRAY);
        frame.getContentPane().setBackground(Color.DARK_GRAY);
        frame.setVisible(true);
    }       
}

【问题讨论】:

  • 你需要一个KeyListener
  • @CoolGuy 我添加了一个,但我不知道如何使矩形移动...我编辑了我的帖子,你可以看看吗?
  • 通过使用 KeyBindigs 而不是 KeyListener,paint 应该是 paintComponent(带有 super.paintComponent),而不是 KeyListener 的成员或除了真正的 JComponent 之外的其他任何东西,例如JPanel,绘画应该由来自paintComponent的动作而不是自身(可能导致无限循环)的repaint()初始化
  • 尝试在PlayerOne 中将paint 的名称更改为repaint。在这里this.x+=5; 你只需增加x 的值。您的程序中没有任何内容使用它。你希望矩形如何移动?也许您需要将fillRect 的第一个参数更改为x
  • @CoolGuy 好的,我做到了,但它仍然不会移动。请考虑到我对 Java 图形和 Java 很陌生。

标签: java swing jpanel paintcomponent keylistener


【解决方案1】:

这里有一堆问题:

问题是你的矩形绘图是硬编码的,这里就是证明:

public void paint(Graphics g){
    g.setColor(Color.RED);
    g.fillRect(125, 480, 60, 10);
}

您需要使用 x 变量而不是 125

为了接受按键事件,你的 JPanel 需要接受焦点,这可以通过以下几行来实现:

setFocusable(true);
requestFocusInWindow();

您现在将收到键盘事件并更改您的x 值。不幸的是,这不会触发重绘,所以你的盒子仍然不会移动。

你真的应该更多地分解你的类,因为你的职责分配有点奇怪。当关键事件发生时,您需要告诉您的 JPanel repaint() 自己更新会反映在屏幕上。

【讨论】:

  • 我改了,还是不动。。增加x后如何重绘PlayerOne?
  • for example 到关于@CoolGuy 的步进绘画的问题(SwingTimer)
最近更新 更多