我有一個獨立的基於java swing的應用程序,它使用帶有JMenuBar的JFrame包含多個Jmenu元素(使用各自的JMenuItem項)。JMenuItem快捷鍵Ctrl-C/Ctrl-V或Ctrl-Insert/Shift-Insert不再工作
在Windows(7和Vista)上升級到最新的1.6.0_41(或1.7.x)JVM後,我注意到使用快捷鍵Ctrl-C(或Ctrl-Insert)的菜單項沒有收到其行動事件如果JTable被添加到框架。然而,如果通過鼠標點擊來訪問菜單,則調用菜單ActionListener。如果JTable被刪除,捷徑就可以工作。如果我將快捷鍵組合更改爲除Ctrl-C或Ctrl-Insert(即Ctrl-L)以外的其他值,則會調用ActionListener。 (我剛剛在Windows Vista上用jvm 1.4確認了它 - 我知道它已經有一段時間了,因爲這個環境得到了任何嚴重的關注:)是Ctrl-C將執行標準拷貝到如果焦點位於可編輯字段的內部,則JTable內部的剪貼板功能。否則,我的菜單ActionListener通過setAccelerator()方法分配的快捷方式調用。
它看起來像1.6中的JTable實現更改*,以便在Windows上以不同方式處理Ctrl-C綁定事件。
在Mac OS上運行此應用程序(JVM 1.6.0_43)我可以看到ActionListener是通過Ctrl-C快捷方式調用的。雖然這可能是因爲JTable使用Command-C而不是Ctrl-C在Mac OS下複製到剪貼板。
我已經提取了演示問題的代碼的相關部分。任何建議,非常感謝。
public class TestFrame extends JFrame {
public TestFrame(String title) {
super(title);
}
private void init() {
getContentPane().setLayout(new BorderLayout());
addMenu();
addTable();
// Change default exit operation
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
private void addTable() {
JTable jTable = new JTable(createTableModel());
// Place table in JScrollPane
JScrollPane scrollPane = new JScrollPane(jTable);
// Add Table
add(scrollPane, BorderLayout.CENTER);
}
private TableModel createTableModel() {
Object[][] data = new Object[][]{
{new Date(), "First Row, 2nd column", "First Row, 3rd column"},
{new Date(), "Second Row, 2nd column", "Second Row, 3rd column"},
};
Object[] columnNames = new Object[]{"Date", "Type", "Description"};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
public boolean isCellEditable(int row, int column) {
return column != 0;
}
};
return model;
}
private void addMenu() {
// Create the menu bar.
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu editMenu = new JMenu("Edit");
menuBar.add(editMenu);
TestActionListener listener = new TestActionListener();
JMenuItem menuItem = null;
menuItem = new JMenuItem("Copy 1");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, ActionEvent.CTRL_MASK));
menuItem.addActionListener(listener);
editMenu.add(menuItem);
menuItem = new JMenuItem("Copy 2");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
menuItem.addActionListener(listener);
editMenu.add(menuItem);
menuItem = new JMenuItem("Copy 3");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, ActionEvent.CTRL_MASK));
menuItem.addActionListener(listener);
editMenu.add(menuItem);
}
public static void main(String[] args) {
TestFrame frame = new TestFrame("Test");
frame.init();
}
private static class TestActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("TestFrame.TestActionListener.actionPerformed(): e="+ e);
}
}
}
JFrame
使用'getMenuShortcutKeyMask()',見[這裏](http://stackoverflow.com/a/5129757/230513)。 – trashgod 2013-04-22 09:46:51