【问题标题】:How would I make a custom keybind with a press of a button in Java?如何在 Java 中按下按钮来制作自定义键绑定?
【发布时间】:2020-04-25 21:03:25
【问题描述】:

正如您可能从标题中看到的那样,我正在尝试用 Java 制作自定义键绑定系统。基本上,我有一个按钮(JButton),我想要发生的是当用户单击该按钮时,它将等待用户的输入以便将其设置为将来使用的键绑定,但我不知道如何做这个。我浏览了互联网,发现有些相似,但实现了特定的键输入而不是任何键输入。如果有类似的问题已经回答,请给我链接,以便我查看。为了简单起见,我将在下面列出一个分步列表。基本上:

  1. 按钮被按下(完成)
  2. 程序等待任何键盘输入
  3. 程序读取输入
  4. 程序停止等待输入
  5. 存储输入(如果是 KeyCode 或其他可以识别输入的内容

如果它可以检测到组合键(如 CTRL + SHIFT + T),那么它就是专业的。如果它可以检测到额外的键(如宏键或鼠标按钮(鼠标侧面的键),那也太棒了。当然,这些是其他问题,我不想在一段时间,但我会把它们留在这里,以防它们可能并且有人知道/想要实现它们。除此之外,我真的不知道我将如何实现这一点。到目前为止,唯一的事情我只有鼠标点击功能,没有别的。如果你能帮助我,那就太棒了。如果你对我的帖子有任何疑问,请向他们提问。感谢您的时间和精力。

【问题讨论】:

    标签: java


    【解决方案1】:

    这是一个按键编辑器的简单示例。

    当您按下更改键按钮,然后按下键盘上的某个键时,显示的字母会发生变化。

    这需要更多代码来处理 Ctrl、Shift 或 Alt 键,但这应该足以让您入门。

    扩展和使用KeyModel 类很重要。这个模型类使其余的视图和控制器代码成为可能。

    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class KeyPressEditor implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new KeyPressEditor());
        }
    
        private GetKey getKey;
    
        private KeyModel keyModel;
    
        private JButton button;
    
        private JTextField keyField;
    
        public KeyPressEditor() {
            this.getKey = new GetKey();
            this.keyModel = new KeyModel();
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("Key Press Editor");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JPanel panel = new JPanel();
            panel.setLayout(new FlowLayout());
    
            JLabel label = new JLabel("Key to initiate function: ");
            panel.add(label);
    
            keyField = new JTextField(10);
            keyField.setEditable(false);
            keyField.setHorizontalAlignment(JTextField.CENTER);
            keyField.setText("K");
            panel.add(keyField);
    
            button = new JButton("Change Key");
            button.addActionListener(new ChangeKey());
            panel.add(button);
    
            frame.add(panel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public void updateKeyField(String key) {
            keyField.setText(key);
        }
    
        public class ChangeKey implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent event) {
                button.addKeyListener(getKey);
            }
    
        }
    
        public class GetKey extends KeyAdapter {        
            @Override
            public void keyPressed(KeyEvent event) {
                keyModel.addKeyEvent(event);
                char c = event.getKeyChar();
                String s = Character.toString(c).toUpperCase();
                updateKeyField(s);
                button.removeKeyListener(getKey);
            }
        }
    
        public class KeyModel {
    
            private List<KeyEvent> keyEvents;
    
            public KeyModel() {
                keyEvents = new ArrayList<>();
            }
    
            public List<KeyEvent> getKeyEvents() {
                return keyEvents;
            }
    
            public void addKeyEvent(KeyEvent keyEvent) {
                this.keyEvents.add(keyEvent);
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多