java - 如何在 Java 中按下按钮来创建自定义按键绑定(bind)?

标签 java

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

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

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

最佳答案

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

Keypress Editor

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

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

扩展和使用 KeyModel 类非常重要。这个模型类使得 View 和 Controller 代码的其余部分成为可能。

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);
        }

    }
}

关于java - 如何在 Java 中按下按钮来创建自定义按键绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61432577/

相关文章:

java - 是否可以在控制台中打印Javadoc?或者将 Javadoc 内容导出到字符串?

java - 如何设置输入整数的限制?

java - 实时观察数百万个微小物体

java - 在自定义 CellRenderer 中覆盖 createToolTip()

java - spring-boot Thymeleaf Multipart 文件上传

java - AWS Java 开发工具包 SSL 证书

java - Okhttp3 - 调用 API 后出现 IndexOutOfBoundsException

java - smack jitsi-jingle 示例

java - 菜单 Intent 上的相机预览卡住

java - 如何在java中打印集合的集合?