【问题标题】:Add keybindings to program为程序添加键绑定
【发布时间】:2014-10-31 18:12:40
【问题描述】:

我目前正在开发一个自动点击程序。我想按例如F10 开始或停止自动点击。我怎样才能做到这一点?如果用户当前打开了其他程序并且自动点击器被最小化,是否也有可能获得按键?

【问题讨论】:

    标签: java swing jframe key-bindings


    【解决方案1】:

    您有正确的标签 ()。对于 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();
                }
            });
        }
    }
    

    “如果用户当前打开了其他程序并且自动点击器被最小化,是否也有可能获得按键?”

    不太清楚这意味着什么。你需要给出更好的解释。

    【讨论】:

    • “不太清楚这意味着什么。” 我把它读作“可以应用程序。”当它不是焦点应用程序时接收事件。?'。 ..答案是“不”。
    • 非常感谢!我会尽快测试它。
    【解决方案2】:

    虽然我可以为你写一大段代码,但我坚信没有什么比 Oracle's Tutorials 更好

    您只需实现 KeyListener 接口并使用该接口中所需的方法:

    方法名称是不言自明的,KeyEventDemo 展示了如何在每个段中使用 cmets 实现这些方法的好方法,以解释发生了什么。

    关于您的帖子,您可以考虑在您的项目中添加一个全局热键,以根据程序的当前状态在按下F10 时启动/停止您的程序。

    对于你问题的第二部分,我没有直接的答案,因为我还没有遇到过这样的情况。但是,我四处搜寻并发现了这个StackOverflow question,它似乎涵盖了您的问题,如果没有,请查看此question,第二个问题提出了我给您的使用全局热键的想法,但必须写在C

    希望对你有帮助

    【讨论】:

    • 不要使用 KeyListener。 Swing 旨在与键绑定一起使用。
    猜你喜欢
    • 2013-01-10
    • 1970-01-01
    • 2018-11-02
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多