将键绑定添加到程序中

时间:2014-09-07 09:23:02

标签: java swing jframe key-bindings

我当前正致力于自动转换程序。我想按,例如F10启动或停止自动点击。我怎样才能做到这一点?如果用户当前打开了另一个程序并且自动闪烁最小化,是否有可能获得按键?

2 个答案:

答案 0 :(得分:1)

虽然我可以给你写一大堆代码,但我坚信没有什么可以胜过Oracle's Tutorials

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

方法名称不言自明,KeyEventDemo显示了如何通过每个细分中的评论来实现这些方法的一种很好的方式来解释发生了什么。

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

对于你问题的第二部分,我没有得到直接答案,因为我还没有遇到过这种情况。然而,我在周围搜寻并遇到了StackOverflow question这似乎涵盖了你的问题,如果没有,请查看这个question,第二个问题提出我给你使用全球热键的想法,但那样做必须写在C

希望这有帮助

答案 1 :(得分:1)

您拥有正确的标记()。使用Swing,通常您希望Key Bindings使用较低级别KeyListener。这是链接中的简短声明(带有一些参数):

  

键侦听器可以作为键盘输入的低级接口,但是对于单个键的响应,键绑定更合适,并且往往会导致更容易维护的代码。如果在组件没有焦点时要激活键绑定,则键监听器也很困难。密钥绑定的一些优点是它们有点自我记录,考虑包含层次结构,鼓励可重用的代码块(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();
            }
        });
    }
}

  

"如果用户当前打开了另一个程序并且自动转换最小化,那么是否有可能获得关键压力?"

不确定这意味着什么。你需要给出一个更好的解释。