Swing/CellEditorTogglePopup のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/CellEditorTogglePopup へ行く。
- 1 (2017-03-30 (木) 14:03:48)
- 2 (2017-04-07 (金) 13:51:51)
- 3 (2017-10-31 (火) 14:11:41)
- 4 (2019-05-21 (火) 14:57:37)
- 5 (2021-02-12 (金) 14:33:39)
- category: swing folder: CellEditorTogglePopup title: JComboBoxセルエディタのドロップダウンリストを編集開始直後は表示しないよう設定する tags: [JTable, JComboBox, TableCellEditor, AncestorListener] author: aterai pubdate: 2015-12-21T00:46:38+09:00 description: JTableのセルエディタとしてJComboBoxを設定し、そのセルを編集開始した場合、すぐにはドロップダウンリストを表示せず、選択状態になるように変更します。 image:
概要
JTable
のセルエディタとしてJComboBox
を設定し、そのセルを編集開始した場合、すぐにはドロップダウンリストを表示せず、選択状態になるように変更します。
Screenshot
Advertisement
サンプルコード
JComboBox<String> combo = new JComboBox<>(model);
combo.addAncestorListener(new AncestorListener() {
@Override public void ancestorAdded(final AncestorEvent e) {
System.out.println("ancestorAdded");
e.getComponent().setEnabled(false);
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
System.out.println("invokeLater");
e.getComponent().setEnabled(true);
}
});
}
@Override public void ancestorRemoved(AncestorEvent e) {}
@Override public void ancestorMoved(AncestorEvent e) {}
});
table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(combo));
View in GitHub: Java, Kotlin解説
Default
: デフォルトのJComboBox
でセルエディタを作成し、そのセルでmousePressed(...)
イベントが発生:- 別の列のフォーカスが存在する(または全セルにフォーカスが存在しない)場合、ドロップダウンリストが表示される
- 同じ列にフォーカスが存在する場合、選択状態になる(ドロップダウンリストは表示されない)
setEnabled
: 動作を統一するために、初回は常に選択状態になるように設定する:BasicComboPopup.Handler#mousePressed(...)
で、マウス左ボタンでJComboBox#isEnabled()==true
の場合は、BasicComboPopup#togglePopup()
が実行される- そのため、セルエディタとして設定する
JComboBox
にAncestorListener
を追加 - 編集開始で
JTable
にこのセルエディタが追加され、AncestorListener#ancestorAdded(...)
が発生するが、JComboBox#setEnabled(false)
として、BasicComboPopup#togglePopup()
が実行されないようにブロック EventQueue.invokeLater(...)
を使用して、マウス操作による一連のイベントの最後にJComboBox#setEnabled(true)
を設定し、すでに編集開始状態にある同セルをもう一度押すとドロップダウンリストが表示されるように設定
参考リンク
- java - JTable with JCombobox editor: handle mouse clicks - Stack Overflow
- JTableのCellEditorにJComboBoxを設定