有没有办法覆盖本机加速键?

Posted

技术标签:

【中文标题】有没有办法覆盖本机加速键?【英文标题】:Is there a way to override native accelerator keys? 【发布时间】:2015-07-15 03:35:15 【问题描述】:

我有一个 JList,其中填充了本机复制方法无法处理的条目。我有一种方法可以按照我想要的方式有效地复制和格式化所选数据,我希望在使用 ctrl + c 时调用此方法,但不幸的是 JList 已经列出了这些加速键,所以当我为我的副本设置它们时我的 JMenu 中的函数它不起作用,除非我给 JMeny 焦点。无论如何,我可以让 ctrl + c 使用我的复制方法而不是本机方法,而不是每次我想复制某些东西时都必须单击 JMenu?

【问题讨论】:

为您要使用的按键添加按键绑定...How to Use Key Bindings。您还可以为绑定 copy 添加 Action... 哇,从我在您的链接中读到的内容,似乎没有办法将我的复制方法转换为一个动作,但这些东西变得非常复杂......我已经使用 ' 将复制绑定到击键copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));'无论如何我可以让 JList 在按下 ctrl +c 时具有相同的效果,而不必花一整天的时间学习如何使用动作? there is no way around converting my copy method into an action but that stuff gets pretty complex... - 为什么说它很复杂? Action 基本上只是一个 ActionListener。您将代码添加到自定义复制操作的 actionPerformed() 方法中。 我认为How To Use Key Bindings 没有提供任何好的示例/对我来说有点难以理解。这个Java Key Binding Tutorial 帮助我更好地理解了它 顺便说一句 -> copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK)); 并不是真正的键绑定 【参考方案1】:

首先查看How to Use Key Bindings 和How to Use Actions

首先创建一个Action,描述它的作用和作用。在这种情况下,您可能需要提供要从中复制的JList(我有某种interface,它提供了某种简单的“复制”方法,但这只是我)

public class CopyAction extends AbstractAction 

    private JList list;

    public CopyAction(JList list) 
        putValue(NAME, "Copy");
        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK));
        putValue(MNEMONIC_KEY, KeyEvent.VK_C);
        putValue(SELECTED_KEY, "Copy stuff");
    

    @Override
    public void actionPerformed(ActionEvent e) 
        System.out.println("All your copies belong to us");
    

    public JList getList() 
        return list;
    


现在,将键绑定添加到 JList,以及您的 Action...

public class TestPane extends JPanel 

    private JList listOfStuff;

    public TestPane() 
        setLayout(new BorderLayout());
        listOfStuff = new JList();
        add(new JScrollPane(listOfStuff));

        CopyAction copyAction = new CopyAction(listOfStuff);
        listOfStuff.getActionMap().put("copy", copyAction);
    

    public JList getListOfStuff() 
        return listOfStuff;
    


现在,您也可以将Action 与按钮一起使用...

TestPane tp = new TestPane();
CopyAction copyAction = new CopyAction(tp.getListOfStuff());

JMenuBar mb = new JMenuBar();
JMenu menu = new JMenu("Edit");
mb.add(menu);
menu.add(copyAction);

JFrame frame = new JFrame("Testing");
frame.setJMenuBar(mb);

还有一个完全可运行的示例......

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test 

    public static void main(String[] args) 
        new Test();
    

    public class CopyAction extends AbstractAction 

        private JList list;

        public CopyAction(JList list) 
            putValue(NAME, "Copy");
            putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK));
            putValue(MNEMONIC_KEY, KeyEvent.VK_C);
            putValue(SELECTED_KEY, "Copy stuff");
        

        @Override
        public void actionPerformed(ActionEvent e) 
            System.out.println("All your copies belong to us");
        

        public JList getList() 
            return list;
        

    

    public Test() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                 catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) 
                    ex.printStackTrace();
                

                TestPane tp = new TestPane();
                CopyAction copyAction = new CopyAction(tp.getListOfStuff());

                JMenuBar mb = new JMenuBar();
                JMenu menu = new JMenu("Edit");
                mb.add(menu);
                menu.add(copyAction);

                JFrame frame = new JFrame("Testing");
                frame.setJMenuBar(mb);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            
        );
    

    public class TestPane extends JPanel 

        private JList listOfStuff;

        public TestPane() 
            setLayout(new BorderLayout());
            listOfStuff = new JList();
            add(new JScrollPane(listOfStuff));

            CopyAction copyAction = new CopyAction(listOfStuff);
            listOfStuff.getActionMap().put("copy", copyAction);
        

        public JList getListOfStuff() 
            return listOfStuff;
        

    


【讨论】:

以上是关于有没有办法覆盖本机加速键?的主要内容,如果未能解决你的问题,请参考以下文章

在本机反应中写入/编辑/覆盖一个json文件

有没有办法让这个 C# 代码自动覆盖文件?

带有用于 IPC 的 WndProc 覆盖的本机 SendMessage 不起作用

EXCEL空白行如何不覆盖的问题

有没有办法覆盖 DataContractJsonSerializer 如何序列化日期?

有没有办法覆盖 dbt Cloud CI 运行的模式名称?