将KeyListener添加到Jframe问题

时间:2017-02-13 18:40:42

标签: java swing netbeans keylistener keyevent

我有一个我在Netbeans中制作的jframe,这个jframe正被另一个java类“启动”,但对于当前的问题并不重要。重要的是我似乎无法弄清楚如何将我的关键监听器添加到我的这个jframe中。我已经实现了键监听器,添加了所需的功能(键入键,按键和键释放)。但我无法弄清楚如何实际添加/启动实际的密钥监听器,使其工作。

到目前为止,我已经尝试了两种不同的东西,首先我尝试在代码的开头添加行addKeylistener(new JFrameList());,其中实际的jframe正在启动,但这样做实际的框架赢了'甚至显示。除此之外,我试图在另一个函数callJframFForm()中添加相同的行,该函数在调用jframe的同时从另一个类调用。但这只会返回错误non-static method addKeyListener(KeyListener) cannot be referenced from a static context。我不知道还有什么其他方法可以添加关键监听器,因此我正在寻求一些帮助。

目前我的代码如下所示。

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class JFrameList extends javax.swing.JFrame implements KeyListener{

    public static String keyPresCod = "";

    public JFrameList() {
        initComponents();
        addKeyListener(new JFrameList()); //This is where I am currently trying to call from, but frame won't show
    }    

    public static void main(String args[]) {
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JFrameList().setVisible(true);
            }
        });  
    }                                                

    // Variables declaration - do not modify                    
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    // End of variables declaration                  

    static void callJframFForm(){
        try {
            //This is where I have also tried to add the initialization line
        } catch(Exception e) {
            e.printStackTrace();
    }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        int codeFKey = e.getKeyCode();

        if (codeFKey == KeyEvent.VK_A) {
            System.out.println("Button A clicked");
                        keyPresCod = "A";
        } else if (codeFKey == KeyEvent.VK_B) {
            System.out.println("Button B clicked");
                        keyPresCod = "B";
        } else {
            System.out.println("Different key pressed");
                        keyPresCod = "Another key";
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

}

2 个答案:

答案 0 :(得分:1)

问题

addKeyListener(new JFrameList())

这将创建一个新的JFrameList对象并使用它的侦听器。这意味着任何击键都存储在新对象的成员中。要查看结果,您必须执行

JFrameList list = new JFrameList();    addKeyListener(列表);    //使用list变量访问keyPressed代码

当然,这不是你想要的行为。您希望键笔划存储在当前实例中,而不是新对象。这意味着你应该做

addKeyListener(this)

虽然你可能会注意到听众只能工作"有时",或者可能根本没有,取决于你如何测试它。

Swing使用焦点系统来管理哪些侦听器应该接收事件,并且由于您要将侦听器添加到JFrame,因此只有当帧处于焦点时,侦听器才会接收事件。

解决方案

你应该use key bindings rather than a key listener

如果您选择继续使用监听器,则应将其添加到按钮,而不是框架:

jButton1.addKeyListener(this);
jButton2.addKeyListener(this);

您可以通过调用event.getSource()来获取事件的来源(您的按钮),而不是检查事件的关键代码。

键绑定允许您为组件设置灵活的焦点设置。您需要做的就是访问组件的输入映射:

String actionCommand = "Press Button A";
jButton1.setActionCommand(actionCommand);
jButton1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("A"), actionCommand);
jButton1.getActionMap(actionCommand, this);

您的JFrameList现在应该实现ActionListener而不是KeyListener,因为它会将您的活动作为操作接收:

class JFrameList extends JFrame implements ActionListener {
    private JButton jButton1;

    public JFrameList() {
        jButton1 = new JButton("A");
        //set action command, add to input map, add to action map
    }

    public void actionPerformed(ActionEvent event) {
        JButton button = (JButton) event.getSource();
        System.out.println(button.getActionCommand() + " was performed.");
    }
}

替代

JButton具有内置的助记符处理功能。您可以通过JButton#setMnemonic(int)指定助记符,其中参数是关键代码:

jButton1.setMnemonic(KeyEvent.VK_A);

这是在图形界面中处理热键的标准方法。只需按住Alt键(窗口),然后按下您设置助记符的键。

答案 1 :(得分:0)

仅将事件调度到具有焦点的组件。您没有发布整个代码,但我猜测焦点在于您添加到框架的按钮,因此按钮获取KeyEvent。

不确定您要使用KeyListener进行的操作。您无法通过查看KeyEvent中键入的字符来判断单击了哪个按钮。

如果您想知道点击了哪个按钮,则需要为每个按钮添加ActionListener。阅读How to Use Buttons上Swing教程中的部分,了解更多信息和示例。