【问题标题】:Why wont this KeyEvent work?为什么这个 KeyEvent 不起作用?
【发布时间】:2014-03-23 01:48:54
【问题描述】:

我正在 java 中制作一些东西,当按下 F1 键时会出现一个 JDialog 窗口。我当前的代码:

public class Keyboard implements KeyListener {

    private boolean[] keys = new boolean[120];

    public boolean up, down, left, right, assets;

    public void tick() {

        assets = keys[KeyEvent.VK_F1];
    }

    public void keyPressed(KeyEvent e) {

        keys[e.getKeyCode()] = true;
    }

    public void keyReleased(KeyEvent e) {

        keys[e.getKeyCode()] = false;
    }

    public void keyTyped(KeyEvent e) {


    }

}

并且在我的主类中的 tick() 方法下:

keyboard.tick();
if(keyboard.assets) ac.run();

keyboard 变量指的是键盘类,而 ac 变量指的是这个类:

public class AssetsChooser extends JDialog {

    JFileChooser fc = new JFileChooser();

    public void run() {

        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        add(fc);

        System.out.println("It works.");
    }
}

当我运行游戏并按 F1 时,没有出现 JDialog 窗口,控制台也没有显示方法。

【问题讨论】:

  • 有些人可能会质疑我设置 KeyListener 和 KeyEvent 的方式,但我向您保证几乎完全相同的代码在我正在制作的不同程序中工作。
  • 什么是assets?当您只关心F1 键时,为什么需要跟踪每个键?在您的keyPressed(KeyEvent) 中,为什么不直接使用if(e.getKeyCode() == KeyEvent.VK_F1){ //open dialog }
  • 你在哪里定义assets
  • 1.资产类似于我的世界纹理包,我的游戏中的纹理和声音可以通过选择 JFileChooser 提供的不同资产文件夹进行自定义
  • 这可能不起作用的原因有很多,最有可能与 KeyListener 仅在其注册的组件可聚焦并且具有键盘焦点时才会响应键事件有关

标签: java swing keylistener jdialog keyevent


【解决方案1】:

Swing 中经常会出现与KeyListener 相关的焦点问题。如KeyListener 教程中所述:

“要定义对特定键的特殊反应,请使用键绑定而不是键侦听器。有关详细信息,请参阅How to Use Key Bindings。”

一个例子(只需按F1):

import java.awt.event.*;
import javax.swing.*;

public class TestF1KeyBind {

    public TestF1KeyBind() {
        final JFrame frame = new JFrame("Frame");
        JPanel panel = new JPanel();

        InputMap im = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "openDialog");
        ActionMap am = panel.getActionMap();
        am.put("openDialog", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                JDialog dialog = new JDialog(frame, true);
                dialog.setSize(300, 300);
                dialog.setTitle("Dialog");
                dialog.setLocationByPlatform(true);
                dialog.setVisible(true);
            }
        });

        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestF1KeyBind();
            }
        });
    }
}

【讨论】:

  • 我也知道 KeyBidings 比 KeyListeners 好,虽然 keyListener 是一个接口,而另一个是类,我发现很难换掉。
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 2013-03-10
  • 1970-01-01
  • 2014-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多