有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Swing键事件随机关闭

我正在用Java制作一个2D游戏。播放时,控件将随机锁定,通常在30秒内,绑定将停止对按键的反应。控件偶尔会在短时间内返回。我使用Z、X和箭头键。单独使用箭头键似乎可以,但Z键和X键似乎可以触发锁定

对于控件,我最初使用KeyListeners,然后使用KeyEventDispatcher,然后尝试键绑定。虽然keylisters似乎仍然触发keyreased事件,只是没有按下keyressed,但它们都会发生这种情况。键绑定完全停止

游戏窗口是JFrame中JPanel中的画布。使用面板的输入和操作映射设置绑定

我在mac电脑上,最近升级到macOS Sierra。我在升级之前就看到过这个问题,但升级之后情况变得更糟,游戏变得无法运行。我还没有在其他操作系统或其他Mac上测试过

我在网上发现一些人似乎也有同样的问题,有人提交了一份bug报告:

https://bugs.openjdk.java.net/browse/JDK-8167263

但除此之外,我还没有找到多少解决方法。在这一点上,我最好的猜测是,这是一个连接到Sierra的bug,要么会有修复程序,要么我的mac上有需要重新配置的东西。我会继续找的。任何建议都很好,因为我可能错过了重要的一步。谢谢大家

下面是一个使用WASD键的可编译示例:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class KeyErrorTest
{
    public KeyErrorTest() {}

    public static void main(String[] args)
    {
        KeyErrorTest keyErrors = new KeyErrorTest();
        keyErrors.go();
    }

    public void go()
    {
        //create panel
        JPanel panel = new JPanel();
        panel.setFocusable(true);
        panel.requestFocusInWindow();

        //set up bindings for press and release
        InputMap inputMap = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
        ActionMap actionMap = panel.getActionMap();
        //W
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false), 1);
        actionMap.put(1, new KeyPresser(KeyEvent.VK_W));
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, true), 2);
        actionMap.put(2, new KeyReleaser(KeyEvent.VK_W));
        //A
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), 3);
        actionMap.put(3, new KeyPresser(KeyEvent.VK_A));
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), 4);
        actionMap.put(4, new KeyReleaser(KeyEvent.VK_A));
        //S
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, false), 5);
        actionMap.put(5, new KeyPresser(KeyEvent.VK_S));
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, true), 6);
        actionMap.put(6, new KeyReleaser(KeyEvent.VK_S));
        //D
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), 7);
        actionMap.put(7, new KeyPresser(KeyEvent.VK_D));
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), 8);
        actionMap.put(8, new KeyReleaser(KeyEvent.VK_D));

        //create frame
        JFrame frame = new JFrame("Key Bindings Test");
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);

        System.out.println("Press [W], [A], [S], or [D] several times");
        System.out.println("The error tends to occur within 30 seconds");
        System.out.println("The keys will randomly stop registering");
    }

    private class KeyPresser extends AbstractAction
    {
        int key;

        public KeyPresser(int key)
        {
            this.key = key;
        }

        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println((char)key+" down");
        }
    }

    private class KeyReleaser extends AbstractAction
    {
        int key;

        public KeyReleaser(int key)
        {
            this.key = key;
        }

        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println((char)key+" up");
        }
    }
}

共 (0) 个答案