Java JMenuItem未通过键盘输入键激活
我会自动生成一组JMenuItem,并在每次右键单击事件时将它们添加到jpopMenu。问题是,当我按所选菜单上的enter键时,为菜单项设置的操作没有运行。我可以使用上/下键在菜单上导航,但是,该操作只能通过鼠标单击来运行 以下是创建菜单项的代码:Java JMenuItem未通过键盘输入键激活,java,macos,swing,unix,jmenuitem,enter,tab,Java,Macos,Swing,Unix,Jmenuitem,Enter,Tab,我会自动生成一组JMenuItem,并在每次右键单击事件时将它们添加到jpopMenu。问题是,当我按所选菜单上的enter键时,为菜单项设置的操作没有运行。我可以使用上/下键在菜单上导航,但是,该操作只能通过鼠标单击来运行 以下是创建菜单项的代码: private JMenuItem createMenuItem(TaskFactory tf, String title, boolean useCheckBoxMenuItem, String toolTipText) { enter
private JMenuItem createMenuItem(TaskFactory tf, String title, boolean useCheckBoxMenuItem, String toolTipText) {
enter code hereJMenuItem item;
PopupAction action = new PopupAction(tf, title);
if ( useCheckBoxMenuItem )
item = new JCheckBoxMenuItem(action);
else
item = new JMenuItem(action);
item.setEnabled(tf.isReady());
item.setToolTipText(toolTipText);
return item;
}
private class PopupAction extends AbstractAction {
TaskFactory tf;
PopupAction(TaskFactory tf, String title) {
super( title );
this.tf = tf;
}
public void actionPerformed(ActionEvent ae) {
m_view.manager.execute(tf.createTaskIterator());
}
}
我曾尝试将focusable设置为true,但没有成功。我已经在Mac10.7、Java版本1.6.0\u33和Ubuntu Java版本1.6.0\u26上试用过。我使用了标准的秋千外观和感觉。在Mac上运行时:look and feel是[Aqua look and feel for Mac OS X-com.apple.laf.AquaLookAndFeel]AFAIK,这就是look'n feel的工作原理。按空格键可以单击按钮和菜单项。Enter用于单击默认按钮。AFAIK,这就是外观的工作原理。按空格键可以单击按钮和菜单项。输入用于单击默认按钮。Windows XP、JDK6_025、使用物质、金属、Windows、Nimbus 编辑1 按下on键或鼠标会触发
isEnabled
编辑2
添加了MenuKeyListener
注意强>
不要使用MenuKeyListener
捕捉另一个KeyEvents
as(空格)和are,否则有时会生成虚假结果,例如未知keyCode:0x0 on…
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.MenuKeyEvent;
import javax.swing.event.MenuKeyListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.table.*;
import org.pushingpixels.substance.api.SubstanceLookAndFeel;
import org.pushingpixels.substance.api.skin.BusinessBlueSteelSkin;
public class TableCheckBox extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
public TableCheckBox() {
Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
Object[][] data = {
{"Buy", "IBM", new Integer(1000), new Double(80.50), false},
{"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true},
{"Sell", "Apple", new Integer(3000), new Double(7.35), true},
{"Buy", "Nortel", new Integer(4000), new Double(20.00), false}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
createPopupMenu();
}
private void createPopupMenu() {
MyMenuKeyListener myMenuKeyListener = new MyMenuKeyListener();
JPopupMenu popup = new JPopupMenu();
JMenuItem myMenuItem1 = new JMenuItem("cccccccccccccccccccccc");
myMenuItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//System.out.println("Done myMenuItem1");
}
});
myMenuItem1.getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
ButtonModel model = (ButtonModel) e.getSource();
if (model.isArmed()) {
//System.out.println("isArmed");
} else if (model.isEnabled()) {
//System.out.println("isEnabled");
} else if (model.isPressed()) {
//System.out.println("isPressed");
} else if (model.isRollover()) {
//System.out.println("isRollover");
} else if (model.isSelected()) {
//System.out.println("isSelected");
}
}
});
myMenuItem1.addMenuKeyListener(myMenuKeyListener);
JMenuItem myMenuItem2 = new JMenuItem("bbbbbbbbbbbbbbbbbbbbbb");
myMenuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//System.out.println("Done myMenuItem2");
}
});
myMenuItem2.getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
ButtonModel model = (ButtonModel) e.getSource();
if (model.isArmed()) {
//System.out.println("isArmed");
} else if (model.isEnabled()) {
//System.out.println("isEnabled");
} else if (model.isPressed()) {
//System.out.println("isPressed");
} else if (model.isRollover()) {
//System.out.println("isRollover");
} else if (model.isSelected()) {
//System.out.println("isSelected");
}
}
});
myMenuItem2.addMenuKeyListener(myMenuKeyListener);
popup.add(myMenuItem1);
popup.add(myMenuItem2);
MouseListener popupListener = new PopupListener(popup);
table.addMouseListener(popupListener);
popup.setLightWeightPopupEnabled(false);
PopupMenuListener popupMenuListener = new MyPopupMenuListener();
popup.addPopupMenuListener(popupMenuListener);
}
private class PopupListener extends MouseAdapter {
private JPopupMenu popup;
PopupListener(JPopupMenu popupMenu) {
popup = popupMenu;
}
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
if (table.getSelectedRow() != -1) {
maybeShowPopup(e);
}
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
private class MyMenuKeyListener implements MenuKeyListener {
public void menuKeyTyped(MenuKeyEvent e) {
MenuElement[] path = e.getPath();
JMenuItem item = (JMenuItem) path[path.length - 1];
System.out.println("Key typed: " + e.getKeyChar()
+ ", " + MenuKeyEvent.getKeyText(e.getKeyCode())
+ " on " + item.getText());
}
public void menuKeyPressed(MenuKeyEvent e) {
MenuElement[] path = e.getPath();
JMenuItem item = (JMenuItem) path[path.length - 1];
System.out.println("Key typed: " + e.getKeyChar()
+ ", " + MenuKeyEvent.getKeyText(e.getKeyCode())
+ " on " + item.getText());
}
public void menuKeyReleased(MenuKeyEvent e) {
MenuElement[] path = e.getPath();
JMenuItem item = (JMenuItem) path[path.length - 1];
System.out.println("Key typed: " + e.getKeyChar()
+ ", " + MenuKeyEvent.getKeyText(e.getKeyCode())
+ " on " + item.getText());
}
}
private class MyPopupMenuListener implements PopupMenuListener {
public void popupMenuCanceled(PopupMenuEvent popupMenuEvent) {
//System.out.println("Canceled");
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent popupMenuEvent) {
//System.out.println("Becoming Invisible");
}
public void popupMenuWillBecomeVisible(PopupMenuEvent popupMenuEvent) {
//System.out.println("Becoming Visible");
}
}
public static void main(String[] args) {
/*SwingUtilities.invokeLater(new Runnable() {
public void run() {
SubstanceLookAndFeel.setSkin(new BusinessBlueSteelSkin());
}
});*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
/*UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());*/
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableCheckBox frame = new TableCheckBox();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
});
}
}
Windows XP、JDK6_025、使用物质、金属、Windows、Nimbus 编辑1 按下on键或鼠标会触发
isEnabled
编辑2
添加了MenuKeyListener
注意强>
不要使用MenuKeyListener
捕捉另一个KeyEvents
as(空格)和are,否则有时会生成虚假结果,例如未知keyCode:0x0 on…
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.MenuKeyEvent;
import javax.swing.event.MenuKeyListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.table.*;
import org.pushingpixels.substance.api.SubstanceLookAndFeel;
import org.pushingpixels.substance.api.skin.BusinessBlueSteelSkin;
public class TableCheckBox extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
public TableCheckBox() {
Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
Object[][] data = {
{"Buy", "IBM", new Integer(1000), new Double(80.50), false},
{"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true},
{"Sell", "Apple", new Integer(3000), new Double(7.35), true},
{"Buy", "Nortel", new Integer(4000), new Double(20.00), false}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
createPopupMenu();
}
private void createPopupMenu() {
MyMenuKeyListener myMenuKeyListener = new MyMenuKeyListener();
JPopupMenu popup = new JPopupMenu();
JMenuItem myMenuItem1 = new JMenuItem("cccccccccccccccccccccc");
myMenuItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//System.out.println("Done myMenuItem1");
}
});
myMenuItem1.getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
ButtonModel model = (ButtonModel) e.getSource();
if (model.isArmed()) {
//System.out.println("isArmed");
} else if (model.isEnabled()) {
//System.out.println("isEnabled");
} else if (model.isPressed()) {
//System.out.println("isPressed");
} else if (model.isRollover()) {
//System.out.println("isRollover");
} else if (model.isSelected()) {
//System.out.println("isSelected");
}
}
});
myMenuItem1.addMenuKeyListener(myMenuKeyListener);
JMenuItem myMenuItem2 = new JMenuItem("bbbbbbbbbbbbbbbbbbbbbb");
myMenuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//System.out.println("Done myMenuItem2");
}
});
myMenuItem2.getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
ButtonModel model = (ButtonModel) e.getSource();
if (model.isArmed()) {
//System.out.println("isArmed");
} else if (model.isEnabled()) {
//System.out.println("isEnabled");
} else if (model.isPressed()) {
//System.out.println("isPressed");
} else if (model.isRollover()) {
//System.out.println("isRollover");
} else if (model.isSelected()) {
//System.out.println("isSelected");
}
}
});
myMenuItem2.addMenuKeyListener(myMenuKeyListener);
popup.add(myMenuItem1);
popup.add(myMenuItem2);
MouseListener popupListener = new PopupListener(popup);
table.addMouseListener(popupListener);
popup.setLightWeightPopupEnabled(false);
PopupMenuListener popupMenuListener = new MyPopupMenuListener();
popup.addPopupMenuListener(popupMenuListener);
}
private class PopupListener extends MouseAdapter {
private JPopupMenu popup;
PopupListener(JPopupMenu popupMenu) {
popup = popupMenu;
}
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
if (table.getSelectedRow() != -1) {
maybeShowPopup(e);
}
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
private class MyMenuKeyListener implements MenuKeyListener {
public void menuKeyTyped(MenuKeyEvent e) {
MenuElement[] path = e.getPath();
JMenuItem item = (JMenuItem) path[path.length - 1];
System.out.println("Key typed: " + e.getKeyChar()
+ ", " + MenuKeyEvent.getKeyText(e.getKeyCode())
+ " on " + item.getText());
}
public void menuKeyPressed(MenuKeyEvent e) {
MenuElement[] path = e.getPath();
JMenuItem item = (JMenuItem) path[path.length - 1];
System.out.println("Key typed: " + e.getKeyChar()
+ ", " + MenuKeyEvent.getKeyText(e.getKeyCode())
+ " on " + item.getText());
}
public void menuKeyReleased(MenuKeyEvent e) {
MenuElement[] path = e.getPath();
JMenuItem item = (JMenuItem) path[path.length - 1];
System.out.println("Key typed: " + e.getKeyChar()
+ ", " + MenuKeyEvent.getKeyText(e.getKeyCode())
+ " on " + item.getText());
}
}
private class MyPopupMenuListener implements PopupMenuListener {
public void popupMenuCanceled(PopupMenuEvent popupMenuEvent) {
//System.out.println("Canceled");
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent popupMenuEvent) {
//System.out.println("Becoming Invisible");
}
public void popupMenuWillBecomeVisible(PopupMenuEvent popupMenuEvent) {
//System.out.println("Becoming Visible");
}
}
public static void main(String[] args) {
/*SwingUtilities.invokeLater(new Runnable() {
public void run() {
SubstanceLookAndFeel.setSkin(new BusinessBlueSteelSkin());
}
});*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
/*UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());*/
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableCheckBox frame = new TableCheckBox();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
});
}
}
您需要向JMenuItem添加一个KeyListener,并将该项设置为可聚焦。让您的JMenuItem请求焦点与
JMenuItem.requestFocus();
当它有焦点时,实现起来很容易
在keylistener中:
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == e.VK_ENTER) {
// do stuff
}
}
您需要向JMenuItem添加一个KeyListener,并将该项设置为可聚焦。让您的JMenuItem请求焦点与
JMenuItem.requestFocus();
当它有焦点时,实现起来很容易
在keylistener中:
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == e.VK_ENTER) {
// do stuff
}
}
对于添加到菜单栏的项目和通过setComponentPopupMenu()
添加到上下文菜单的项目,使用Action
似乎可以正确地执行此操作。Enter或Space从菜单栏或关联菜单中调用选定的菜单项
另一方面,请注意使用getMenuShortcutKeyMask()
作为跨平台MASK
对于添加到菜单栏的项目和通过setComponentPopupMenu()
添加到上下文菜单的项目,使用Action
似乎可以正常工作。Enter或Space从菜单栏或关联菜单中调用选定的菜单项
另外,请注意使用
getMenuShortcutKeyMask()
作为跨平台MASK
谢谢回复,空格键也不起作用!对我来说,空格键或回车键都可以,如果他们运行这个动作。user1475727请你具体点,NativeOS、Java版本和used Look and Feel中的哪一个是对的,因为(@JB niset)可能是对的。我已经在Mac 10.7上试过了,Java版本1.6.0!和Ubuntu Java版本1.6.0!26。我使用的是标准的swing外观。@user1475727那么您正在等待真正的swing&OSX(***nix)专家,我将为replu更新tagsThanks,空格键也不起作用!对我来说,空格键或回车键都可以,如果他们运行这个动作。user1475727请你具体点,NativeOS、Java版本和used Look and Feel中的哪一个是对的,因为(@JB niset)可能是对的。我已经在Mac 10.7上试过了,Java版本1.6.0!和Ubuntu Java版本1.6.0!26。我使用了标准的swing外观。@user1475727那么你已经在等待真正的swing&OSX(***nix)专家了,我会更新tagsI刚刚尝试了这个,但没有效果,菜单项不监听关键事件@user1475727非常奇怪,它在JMenuBar中有,但不是在jpopMenu中,我将查看它。没错,菜单栏也适用于我的应用程序!我刚刚尝试了这个,但没有成功,菜单项不收听关键事件@user1475727非常奇怪,它在JMenuBar中有,但不是在jpopMenu中,我将查看它。没错,菜单栏也适用于我的应用程序!请查看我的编辑,测试ButtonModel
作为我最喜欢的XxxMenuXxx
的监听器,他们的键盘或鼠标尝试应用Nimbus外观,但菜单项仍然不监听回车/空格键。aaach,我将添加代码示例实现menukeylistener请查看我的编辑,测试ButtonModel
作为我最喜欢的XxxMenuXxx
的监听器,他们的键盘或鼠标甚至尝试应用Nimbus外观,但菜单项仍然不监听回车键/空格键。aaach,我将添加代码示例实现menukeylistener我在Mac上尝试了这段代码,效果非常好(enter和空格键都在运行操作)!但我尝试在我的代码上打印更改侦听器,enter不会触发任何更改!我也尝试了Nimbus look and feel,但“功能表”仍然不听enter!我在Mac上尝试了此代码,效果非常好(enter和空格键都在运行操作)但是我试着在我的代码上打印更改侦听器,输入不进行任何更改!我还尝试了nimBUS的外观和感觉,但是菜单仍然没有听进去。@ RoZaGH:我怀疑问题是在看不见的代码中。如果你能产生一个显示问题的话,我会试着运行它。请随意使用我的例子作为基础。弹出菜单和菜单我的代码中的项目是基于鼠标事件位置生成的,并使用“show(x,y)”方法进行调用