在Swing中通过KeyListener移动元素

时间:2014-06-11 14:06:01

标签: java swing keylistener

我有KeyListener的问题,我一直在寻找解决方案,但它应该工作。 不幸的是,它没有,我不知道为什么。当我输入箭头时,没有任何反应。 我正在读“焦点”,但我不知道它是如何工作的,也许你可以给我一些例子,对我的问题不必要。

public class Trawa extends JPanel implements KeyListener {
int wysokosc = 200;
public Trawa(){
    addKeyListener(this);
    setSize(200,600);
    setBackground(Color.GREEN);
}
public void paint(Graphics g) {
            super.paint(g);
            Graphics2D g2d = (Graphics2D) g;

            Color c1 = new Color(36,217,36);
            g2d.setColor(c1);
            g2d.fillRect(10, wysokosc, 100, 100);
            c1 = new Color(0,0,0);
            g2d.setColor(c1);
            g2d.fillRect(10, wysokosc, 30, 30);
            g2d.fillRect(80, wysokosc, 30, 30);
            c1 = new Color(252,3,0);
            g2d.setColor(c1);
            g2d.fillRect(40, wysokosc+60 ,30,30);
}
@Override
public void keyPressed(KeyEvent arg0) {
    int key = arg0.getKeyCode();
    if(key == KeyEvent.VK_UP)
        wysokosc-=100;
    repaint();  
}
@Override
public void keyReleased(KeyEvent arg0) {


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

}
}

这是我的主要类框架。也许问题出在这里。

public class GUI extends JFrame{
public GUI(){
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    add(new Trawa());
    setLayout(new GridLayout(1,5));
    pack();
    setSize(1300, 600);
    setLocation(40, 100);
    setVisible(true);
}

public static void main(String[] args) {
    new GUI();
  }
}

2 个答案:

答案 0 :(得分:2)

在使用KeyListener之前,您必须了解焦点的工作原理。

尝试从JPanel的构造函数中调用setFocusable(true)。

答案 1 :(得分:0)

您已正确完成所有操作,但忘记将关键监听器与您的框架绑定。

试试这个版本的GUI类

class GUI extends JFrame {
    public GUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        Trawa t = new Trawa();//this is a JPanel as well as a KeyListner
        add(t);
        this.addKeyListener(t);
        setLayout(new GridLayout(1, 5));
        pack();
        setSize(500, 400);
        setLocation(40, 100);
        setVisible(true);

    }
}

凯文指出:所需的最小变化是将焦点放在面板上

public Trawa() {
    addKeyListener(this);
    setSize(200, 600);
    setBackground(Color.GREEN);     
    setFocusable(true);     
}