1

我一直在阅读 java 文档,并试图了解关键侦听器及其用途。我设法制作了一个简单的程序,其中“w”和“s”切换了背景颜色,但是当我试图让他们移动一个彩球时,他们停止了响应。当我阅读 JavaDocs 常见的绘画问题时,我相当确定这不是绘画问题。我已经将 JFrame 设置为可聚焦的(或者至少我认为我有)。如果有人能指出我正确的方向,将不胜感激。

这是主要课程

import javax.swing.JFrame;
import java.awt.EventQueue;

public class frame {

    public static void main(String[] args){

         EventQueue.invokeLater(new Runnable()
         {                 
            @Override
             public void run()
             {       
                 showGui();                                                   
             }
         });        
    }

    public static void showGui(){
        JFrame f = new JFrame("Testing..");
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
          f.setFocusable(true);
            f.add(new Gui());
            f.setSize(300,300);
            f.setVisible(true);              
    }
}

和 Gui/KeyListener 类

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Gui extends JPanel {

    public Gui(){
        HandlerClass handle = new HandlerClass();
         setBorder(BorderFactory.createLineBorder(Color.black));
         addKeyListener(handle);
    }

    int x = 30;
    int y = 30;

    public void paintComponent(Graphics g){
        super.paintComponents(g);
        g.setColor(Color.BLUE);
        g.fillRect(x, y, 20, 20);   


    }

    private class HandlerClass implements KeyListener{

        public void keyTyped(KeyEvent e) {
            switch (e.getKeyChar()){
            case 'w': 
            repaint(x,y+1, 20,20);
                break;
            case 's': 
                repaint(x,y-1, 20,20);
                System.out.println("testing if this fires");
            break;
            }               
        }

        public void keyPressed(KeyEvent e) {
            //todo
        }
        public void keyReleased(KeyEvent e) {
            //todo

        }

    }

}

任何指向正确方向的指示都会非常有帮助,谢谢。

4

3 回答 3

2

如果你已经搜索过这个站点,你就会知道这个解决方案:不要使用 KeyListeners,而是使用 Key Bindings。如果您还没有搜索过这个网站,那么您应该在提问之前完成此操作。

例如:我以前的答案与示例代码

于 2013-04-26T01:48:18.373 回答
2

KeyListener只有当它附加到的组件是可聚焦的并且具有焦点时才会响应关键事件。

JPanel默认情况下不满足这些要求中的任何一个(默认情况下,它是不可聚焦的)。

由于这些原因,不建议您使用KeyListener,而是使用Key Bindings,它有能力克服这些问题

于 2013-04-26T01:48:34.920 回答
0
repaint(x,y+1, 20,20);

你画y得稍微高一点,但你实际上并没有改变y。尝试:

repaint(x,++y, 20,20);

这同样适用于您的其他听众(在另一个方向上)。

于 2013-04-26T01:49:26.940 回答