JComboBoxのItemをキー入力やJPopupMenuでコピーする
Total: 2108
, Today: 5
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JComboBox
のItem
をキー入力やJPopupMenu
を使用してコピーします。
Screenshot
Advertisement
サンプルコード
JComboBox<String> combo1 = new JComboBox<>(makeModel(5));
Action copy = new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
JComboBox<?> combo = (JComboBox<?>) e.getSource();
Optional.ofNullable(combo.getSelectedItem()).ifPresent(text -> {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable contents = new StringSelection(Objects.toString(text));
clipboard.setContents(contents, null);
System.out.println(text);
});
}
};
ActionMap am = combo1.getActionMap();
am.put(COPY_KEY, copy);
int modifiers = InputEvent.CTRL_DOWN_MASK;
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C, modifiers);
InputMap im = combo1.getInputMap(JComponent.WHEN_FOCUSED);
im.put(keyStroke, COPY_KEY);
JPopupMenu popup = new JPopupMenu();
popup.add(COPY_KEY).addActionListener(e -> {
Object o = popup.getInvoker();
Container c = o instanceof JComboBox
? (Container) o
: SwingUtilities.getAncestorOfClass(JComboBox.class, (Component) o);
if (c instanceof JComboBox) {
JComboBox<?> combo = (JComboBox<?>) c;
Action a = combo.getActionMap().get(COPY_KEY);
a.actionPerformed(new ActionEvent(combo, e.getID(), e.getActionCommand()));
// KeyEvent keyEvent = new KeyEvent(combo, 0, 0, 0, 0, 'C');
// SwingUtilities.notifyAction(a, keyStroke, keyEvent, combo, modifiers);
}
});
combo1.setComponentPopupMenu(popup);
View in GitHub: Java, Kotlin解説
Default:
- デフォルトでは編集不可の
JComboBox
にCtrl+Cなどのキー入力でのコピー機能はない
- デフォルトでは編集不可の
Editable: false, JPopupMenu, Ctrl+C
- 編集不可の
JComboBox
にActionMap
とInputMap
を使用してCtrl+Cキーで現在選択中のアイテム文字列をコピー可能に設定 JComboBox#setComponentPopupMenu(...)
でActionMap
に追加したコピーイベントを呼び出せるよう設定JComboBox
のボタン上でJPopupMenu
を呼び出すとJPopupMenu#getInvoker()
でJButton
が返るので注意が必要
- 編集不可の
Editable: true, JPopupMenu, Ctrl+C
JComboBox#getEditor().getEditorComponent()
で取得したJTextField
にJTextField#setComponentPopupMenu(...)
でコピーなどを実行するJPopupMenu
を設定JTextField
はデフォルトでCtrl+Cキーなどでのコピーが可能
参考リンク
- swing - Copy text in combo-box Java - Stack Overflow
- DefaultEditorKitでポップアップメニューからコピー
- JPopupMenuを開く前に対象となるJTextFieldにFocusを移動する