正如您可能已经从标题中读到的,我正在尝试用 Java 制作一个自定义按键绑定(bind)系统。基本上,我有一个按钮(JButton),我想要发生的是当用户单击该按钮时,它将等待用户的输入,以便将其设置为将来使用的按键绑定(bind),但我不知道如何做这个。我浏览了互联网,发现了一些相似的东西,但实现了特定的键输入而不是任何键输入。如果像这样的问题已经得到解答,请将我链接到该问题,以便我查看。为了简单起见,我将在下面列出一步一步的列表。基本上:
- 按下按钮(完成)
- 程序等待任何键盘输入
- 程序读取输入
- 程序停止等待输入
- 存储输入(无论是 KeyCode 还是其他可以识别输入的内容
如果它可以检测到组合键(例如 CTRL + SHIFT + T),那么它就是专业版。如果它可以检测到额外的按键(例如宏键或鼠标按钮(位于鼠标一侧的按键),那么这也将是令人惊奇的。当然,这些是其他问题,我不想在一次,但我会把它们留在这里,以防它们可能并且有人知道/想要实现它们。除此之外,我真的不知道如何才能实现这一目标。到目前为止,唯一的事情我只有鼠标点击功能,没有其他功能。如果您能帮助我,那就太棒了。如果您对我的帖子有任何疑问,请询问他们。感谢您的时间和精力。
最佳答案
这是按键编辑器的一个简单示例。
当您按“更改键”按钮,然后按键盘上的某个键时,显示的字母会发生变化。
这需要更多代码来处理 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/