在JFrame上使用KeyListener移动组件

时间:2014-09-29 06:49:53

标签: java swing keylistener

所以我想将String移向用户推动的方向,但它不起作用。它与mouselistener一起工作,所以我认为这是足够的。我应该将听众添加到其他内容吗?

public class Snake extends JComponent implements KeyListener{

    private int x;
    private int y;
    private String s;

    public Snake(String s, int x, int y){
        this.s = s;
        this.x = x;
        this.y = y;
        addKeyListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.drawString(s, x, y);
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        switch(code) {
            case KeyEvent.VK_UP:
                y-=15;
            case KeyEvent.VK_DOWN:
                y+=15;
            case KeyEvent.VK_RIGHT:
                x+=15;
            case KeyEvent.VK_LEFT:
                x-=15;
        }
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

public class Game {

    public static void main(String[] args){
        JFrame frame = new JFrame("Up Up And Away!");
        JComponent star = new Snake("*", 250, 100);
        frame.add(star);
        frame.setSize(500, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:1)

正如其他人提到的那样。使用Key Bindings可能更好。但是在你的情况下,你的焦点在其他地方,所以你的组件只需要抓住焦点。只需在主要内容中添加 star.grabFocus(); 即可。即:

public static void main(String[] args){
    JFrame frame = new JFrame("Up Up And Away!");
    JComponent star = new Test2("*", 250, 100);
    frame.add(star);
    frame.setSize(500, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    star.grabFocus();
}

然后它应该工作。

答案 1 :(得分:1)

您的KeyListener已应用于JComponent但未应用于JFrame,当您运行程序时,JFrame具有焦点(只有JFrame可以侦听KeyEvents),将以下行添加到您的游戏中那么它应该工作:)

frame.addKeyListener((KeyListener)star);