我對Swing UI有一個簡單的願望:映射到組件的InputMap
的標準複製操作。接下來在這個相同的組件中有一個彈出菜單,我想添加一個運行復制操作的菜單項,當然會顯示inputMap中的鍵盤快捷鍵。如何將標準複製操作映射到Swing中的彈出菜單中
這是映射,我終於成功地添加爲的this幫助一個通用的規則,通過認識到某些組件使用「複製」的MAC版本,而其他人使用DefaultEditorKit.copyAction:
現在inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), DefaultEditorKit.copyAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), "copy");
,我可以找到
ActionMap actionMap = myTable.getActionMap();
Action action = actionMap.get("copy");
一個表的動作,比如現在,我用行動來創建菜單項:
JPopupMenu popupMenu = new JPopupMenu();
JMenuItem item = new JMenuItem(action);
popupMenu.add(item);
table.setComponentPopupMenu(popupMenu);
因此,我看到菜單項,但它不會複製任何內容,儘管映射到相同操作的快捷鍵不會複製。我甚至可以定義快捷鍵(我似乎必須定義自己,但也只是作爲一個用戶,這些東西有某種聯繫在一起的暗示):
int MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK);
item.setAccelerator(keyStroke);
所以,我缺少什麼?我甚至想專門定義的動作偵聽器,但無濟於事:
item.addActionListener(myTable.getActionForKeyStroke(keyStroke));
聽起來很可笑的是,鍵盤快捷方式自動工作(我必須弄清楚如何使蘋果代替Ctrl鍵的加利福尼亞 - 重點工作(只花了幾個小時)),現在我不能讓菜單條目與現有的動作無關(即使工作了幾個小時)。
參見[*什麼是JTable中CTRL + C事件的名字?*](https://stackoverflow.com/q/14356859/230513)的一些替代品。 – trashgod
嗯,似乎myTable.getInputMap()。get(KeyStroke.getKeyStroke(KeyEvent.VK_C,MASK))給出'null'。但「copy」是actionMap中的名稱,而actionMap.get(「copy」)會提供有效的Action。 –
您忘記了'WHEN_ANCESTOR_OF_FOCUSED_COMPONENT'。 – trashgod