【发布时间】:2014-10-31 18:12:40
【问题描述】:
我目前正在开发一个自动点击程序。我想按例如F10 开始或停止自动点击。我怎样才能做到这一点?如果用户当前打开了其他程序并且自动点击器被最小化,是否也有可能获得按键?
【问题讨论】:
标签: java swing jframe key-bindings
我目前正在开发一个自动点击程序。我想按例如F10 开始或停止自动点击。我怎样才能做到这一点?如果用户当前打开了其他程序并且自动点击器被最小化,是否也有可能获得按键?
【问题讨论】:
标签: java swing jframe key-bindings
您有正确的标签 (key-bindings)。对于 Swing,通常您希望在较低级别的 KeyListener 上使用 Key Bindings。这是链接中的简短声明(带有一些参数):
按键侦听器作为键盘输入的低级接口,但对于响应单个按键,按键绑定更合适,并且往往会导致更易于维护的代码。如果要在组件没有焦点时激活键绑定,则键侦听器也很困难。键绑定的一些优点是它们在某种程度上是自我记录的,考虑到包含层次结构,鼓励可重用的代码块(Action 对象),并允许轻松删除、自定义或共享操作。此外,它们使更改绑定到动作的键变得容易。 Actions 的另一个优点是它们具有启用状态,这提供了一种简单的方法来禁用操作,而无需跟踪它附加到哪个组件。
至于你的问题:
“我想按例如 F10 开始或停止自动点击。我该怎么做?”
您基本上想将键绑定到框架的内容窗格。这将允许 F10 动作发生,无论哪个组件被聚焦(只要您使用正确的 `InputMap
这是一个例子。请务必阅读教程How to use Key Bindings 以获得进一步的解释。
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.*;
public class KeyBindDemo {
private JButton clicker;
public KeyBindDemo() {
JFrame frame = new JFrame();
JPanel contentPane = (JPanel)frame.getContentPane();
addKeyBind(contentPane, "F10");
clicker = new JButton("Clicker");
contentPane.add(clicker);
frame.setLayout(new GridBagLayout());
frame.setSize(300, 300); // you should pack() instead.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
Action disableButtonAction = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
clicker.setEnabled(!clicker.isEnabled());
}
};
private static final String DISABLE_CLICKER = "disableClicker";
private void addKeyBind(JComponent contentPane, String key) {
InputMap iMap = contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap aMap = contentPane.getActionMap();
iMap.put(KeyStroke.getKeyStroke(key), DISABLE_CLICKER);
aMap.put(DISABLE_CLICKER, disableButtonAction);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new KeyBindDemo();
}
});
}
}
“如果用户当前打开了其他程序并且自动点击器被最小化,是否也有可能获得按键?”
不太清楚这意味着什么。你需要给出更好的解释。
【讨论】:
虽然我可以为你写一大段代码,但我坚信没有什么比 Oracle's Tutorials 更好
您只需实现 KeyListener 接口并使用该接口中所需的方法:
方法名称是不言自明的,KeyEventDemo 展示了如何在每个段中使用 cmets 实现这些方法的好方法,以解释发生了什么。
关于您的帖子,您可以考虑在您的项目中添加一个全局热键,以根据程序的当前状态在按下F10 时启动/停止您的程序。
对于你问题的第二部分,我没有直接的答案,因为我还没有遇到过这样的情况。但是,我四处搜寻并发现了这个StackOverflow question,它似乎涵盖了您的问题,如果没有,请查看此question,第二个问题提出了我给您的使用全局热键的想法,但必须写在C。
希望对你有帮助
【讨论】: