Swing/ComboBoxItemCopy のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ComboBoxItemCopy へ行く。
- 1 (2018-11-20 (火) 15:51:10)
- 2 (2018-12-10 (月) 16:23:10)
- 3 (2020-11-11 (水) 02:08:22)
- 4 (2022-11-06 (日) 20:07:59)
- category: swing folder: ComboBoxItemCopy title: JComboBoxのItemをキー入力やJPopupMenuでコピーする tags: [JComboBox, JPopupMenu, ActionMap, InputMap] author: aterai pubdate: 2018/11/19T16:40:06+09:00 description: JComboBoxのItemをキー入力やJPopupMenuを使用してコピーします。 image: https://drive.google.com/uc?id=1NdGJia5hxUObZKEOuG1aS83TzDZvfjOpXQ
概要
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を移動する