首页 > 解决方案 > 如何在 Java 中按下按钮来制作自定义键绑定?

问题描述

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

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

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

标签: java

解决方案


这是一个按键编辑器的快速示例。

按键编辑器

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

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

    }
}

推荐阅读