有 Java 编程相关的问题?

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

在Java中,如何通过按下按钮来创建自定义键绑定?

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

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

如果它能检测到组合键(比如CTRL+SHIFT+T),那么这就是pro。如果它能检测到额外的键(如宏键或鼠标按钮(位于鼠标一侧),那也会很神奇。当然,这些都是其他问题,我不想一次问一个以上的问题,但我会把它们留在这里,以防它们是可能的,并且有人知道/想要实施它们。除此之外,我真的不知道如何才能做到这一点。到目前为止,我只有鼠标点击功能,没有其他功能。如果你能帮我,那就太棒了。如果你对我的帖子有任何问题,请问他们。谢谢你的时间和努力


共 (1) 个答案

  1. # 1 楼答案

    下面是一个按键编辑器的快速示例

    Keypress Editor

    按“更改”键,然后按键盘上的一个键时,显示的字母会更改

    这需要更多的代码来处理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);
            }
    
        }
    }