在一个带有Swing GUI的小型Java独立程序中,我将JMenuItem与加速器结合使用--基本上没有任何问题:
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也正常工作),但是我的加速器没有工作-所以我不能再用Ctrl+C启动“连接”了。
你们中有人知道这个问题是什么吗?或者我怎样才能避免这个问题?
其他加速器(但没有暂时禁用)的菜单项正在工作。打电话时
item.getAccelerator();在调用item.setEnabled(true)之后,我得到了以前设置的KeyStroke。
它适用于KeyStroke Ctrl+U,但不适用于Ctrl+C。在我看来,当禁用菜单项时,默认的复制操作再次在Ctrl+C中注册,在再次启用菜单项之后,KeyStroke和菜单项之间不再有任何连接。
试图构建我的程序的一个小副本来演示我遇到的问题:
I一起做了两件事--启用了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();
}}
发布于 2014-07-28 18:47:22
我在试图启用“复制/剪切”菜单项(以及工具栏中的按钮)时遇到了同样的问题,只有在JTable中通过在ListSelectionListener中调用setEnabled (true)来选择某些内容时。
我通过每次调用requestFocusInWindow (true)时为包含项目的JMenuBar调用setEnable (True)来解决问题。
似乎选择表中的某些内容将Ctrl+C / Ctrl+x指向表.
也许能帮上忙
发布于 2014-03-19 13:43:54
尝试创建以下方法:
private KeyStroke getNewKeyStroke(){
KeyStroke ks = KeyStroke.getKeyStroke('C', Event.CTRL_MASK);
return KeyStroke;
} 然后,您可以像这样调用以下方法:
item.setEnabled(true);
item.setAccelerator(this.getNewKeyStroke());https://stackoverflow.com/questions/22507505
复制相似问题