有没有办法覆盖本机加速键?
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;
【讨论】:
以上是关于有没有办法覆盖本机加速键?的主要内容,如果未能解决你的问题,请参考以下文章
带有用于 IPC 的 WndProc 覆盖的本机 SendMessage 不起作用