【问题标题】:Moving element by KeyListener in Swing在 Swing 中通过 KeyListener 移动元素
【发布时间】:2014-08-01 15:14:31
【问题描述】:

我遇到了 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();
  }
}

【问题讨论】:

标签: java swing keylistener


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    试试这个版本的 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);
    
        }
    }
    

    正如 Kevin 所指出的:所需的最小更改是将焦点设置在面板上

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

    【讨论】:

    • 所有这一切都是将 KeyListener 移动到 JFrame 而不是 JPanel。相反,您应该在 JPanel 中调用 setFocusable(true) 以便它接收焦点。
    • 正确地说,这是因为框架已经关注它。感谢您的评论。
    猜你喜欢
    • 2015-03-28
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多