java - 如何在 Java 中按下按钮来制作自定义键绑定?
问题描述
正如您可能已经从标题中读到的,我正在尝试用 Java 制作自定义键绑定系统。基本上,我有一个按钮(JButton),我想要发生的是当用户单击该按钮时,它将等待用户的输入以便将其设置为将来使用的键绑定,但我不知道如何做这个。我环顾互联网,发现有些相似,但实现了特定的键输入而不是任何键输入。如果有类似的问题已经回答,请给我链接,以便我查看。为了简单起见,我将在下面列出一个分步列表。基本上:
- 按钮被按下(完成)
- 程序等待任何键盘输入
- 程序读取输入
- 程序停止等待输入
- 存储输入(如果是 KeyCode 或其他可以识别输入的内容)
如果它可以检测到组合键(如 CTRL + SHIFT + T),那么它就是专业的。如果它可以检测到额外的键(如宏键或鼠标按钮(鼠标侧面的键),那也太棒了。当然,这些是其他问题,我不想在一段时间,但我会把它们留在这里,以防它们可能并且有人知道/想要实现它们。除此之外,我真的不知道我将如何实现这一点。到目前为止,唯一的事情我只有鼠标点击功能,没有别的。如果你能帮助我,那就太棒了。如果你对我的帖子有任何疑问,请问他们。谢谢你的时间和精力。
解决方案
这是一个按键编辑器的快速示例。
当您按下更改键按钮,然后按下键盘上的一个键时,显示的字母会发生变化。
这需要更多代码来处理 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);
}
}
}
推荐阅读
- timestamp - 带有时间戳的 Prometheus 指标
- java - 如何创建数组(Java)
- python - PyTorch - 删除批量规范会在推理中给出不同的模型结果
- php - 从 OR (|) 操作回溯相应正则表达式的逻辑方法
- python - 检查纬度/经度点是否在陆地或海洋上
- java - 如果在 Java 8 中的流之前集合为空,如何返回 false?
- django - 如何修改 AWS 静态文件的 Django 设置以适应 django summernote
- javascript - 如何从某个数组进行插入验证?
- latex - Latex 无法添加作者
- curl - Curl - 如何捕捉空响应