在带有Swing GUI的小型Java独立程序中,我将JMenuItem与Accelerator一起使用 - 大多没有任何问题:
JMenuItem item = new JMenuItem("Connect", 'C');
KeyStroke ks = KeyStroke.getKeyStroke('C', Event.CTRL_MASK);
item.setAccelerator(ks);
item.addActionListener(this);
我的问题是当我用
禁用项目时item.setEnabled(false);
稍后使用
启用它item.setEnabled(true);
我不能再使用加速器了。 JMenuItem在菜单中正确显示为已启用,我可以用鼠标单击它(我的ActionListener正常工作)但我的加速器没有工作 - 所以我无法启动" Connect" Ctrl + C 。
你们中有谁知道这个问题是什么,或者我怎么能避免它?
加速器的其他菜单项(但没有暂时禁用)正在运行。致电时
item.getAccelerator();
调用 item.setEnabled(true)后,我得到之前设置的KeyStroke。
它适用于KeyStroke Ctrl + U,但不适用于Ctrl + C.在我看来,当禁用菜单项时,使用Ctrl + C再次注册默认复制操作,再次启用菜单项后,KeyStroke和菜单项之间不再连接。
在尝试构建我的程序的小副本以证明问题时我得到了它:
我一起做了两件事 - 启用JMenuItem(使用KeyStroke Ctrl + C)并请求焦点为JTextField。
这是一个程序的小代码,它对KeyStroke Ctrl + C没有反应,它连接到一个菜单项:
public class ProblemDemo extends JFrame implements ActionListener {
public ProblemDemo() {
super("ProblemDemo");
setSize(500,500);
setLocation(500,300);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JMenuBar menubar = new JMenuBar();
JMenuItem menuItem = new JMenuItem("JMenuItem", 'C');
menuItem.setAccelerator(KeyStroke.getKeyStroke('C', Event.CTRL_MASK));
menuItem.addActionListener(this);
JMenu menu = new JMenu("Actions");
menu.add(menuItem);
menubar.add(menu);
setJMenuBar(menubar);
JTextArea textarea = new JTextArea();
getContentPane().setLayout(new BorderLayout());
getContentPane().add(textarea, BorderLayout.CENTER);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent event) {
if ("JMenuItem".equals(event.getActionCommand())) {
System.out.println("JMenuItem clicked");
}
}
public static void main(String[] args) {
new ProblemDemo();
}
}
答案 0 :(得分:1)
尝试启用复制/剪切菜单项(以及工具栏中的按钮)时遇到同样的问题,只有在JTable中通过调用ListSelectionListener中的setEnabled(true)选择了某些内容时才会出现。
我通过每次调用setEnable(true)时为包含项目的JMenuBar调用requestFocusInWindow来解决我的问题。
似乎在表格中选择某些内容会将Ctrl + C / Ctrl + x指向表格...
可能是它的帮助
答案 1 :(得分:0)
尝试创建以下方法:
private KeyStroke getNewKeyStroke(){
KeyStroke ks = KeyStroke.getKeyStroke('C', Event.CTRL_MASK);
return KeyStroke;
}
然后您可以调用以下方法:
item.setEnabled(true);
item.setAccelerator(this.getNewKeyStroke());