Swing/BasicComboPopup のバックアップ(No.25)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/BasicComboPopup へ行く。
- 1 (2008-01-08 (火) 16:25:30)
- 2 (2008-01-08 (火) 18:18:36)
- 3 (2008-01-10 (木) 17:38:04)
- 4 (2008-01-16 (水) 15:22:10)
- 5 (2008-02-22 (金) 15:13:04)
- 6 (2008-02-22 (金) 17:00:18)
- 7 (2008-04-16 (水) 10:35:44)
- 8 (2008-08-18 (月) 10:19:03)
- 9 (2009-06-09 (火) 20:38:02)
- 10 (2010-12-13 (月) 00:02:39)
- 11 (2012-08-14 (火) 15:25:43)
- 12 (2013-03-22 (金) 11:52:43)
- 13 (2013-07-26 (金) 01:29:00)
- 14 (2013-07-27 (土) 00:56:11)
- 15 (2013-07-31 (水) 23:33:28)
- 16 (2013-08-20 (火) 14:20:43)
- 17 (2013-09-06 (金) 11:36:56)
- 18 (2013-09-08 (日) 02:32:01)
- 19 (2013-12-19 (木) 21:29:45)
- 20 (2014-06-04 (水) 22:13:11)
- 21 (2014-10-29 (水) 01:46:12)
- 22 (2014-11-01 (土) 00:46:09)
- 23 (2014-11-25 (火) 03:03:31)
- 24 (2015-11-24 (火) 03:01:26)
- 25 (2016-08-17 (水) 18:48:32)
- 26 (2016-09-02 (金) 12:36:08)
- 27 (2017-03-30 (木) 14:01:28)
- 28 (2017-11-02 (木) 15:34:40)
- 29 (2018-03-08 (木) 16:52:23)
- 30 (2020-03-17 (火) 18:31:41)
- 31 (2021-09-23 (木) 11:51:26)
- 32 (2022-08-20 (土) 22:15:25)
- category: swing folder: BasicComboPopup title: JComboBoxを使ってポップアップメニューをスクロール tags: [BasicComboPopup, JTextPane, JComboBox] author: aterai pubdate: 2005-10-17 description: JComboBoxを使ってスクロール可能なポップアップメニューを表示します。 image:
概要
JComboBox
を使ってスクロール可能なポップアップメニューを表示します。
Screenshot
Advertisement
サンプルコード
class EditorComboPopup extends BasicComboPopup {
private final JTextComponent textArea;
private transient MouseAdapter listener;
protected EditorComboPopup(JTextComponent textArea, JComboBox cb) {
super(cb);
this.textArea = textArea;
}
@Override protected void installListListeners() {
super.installListListeners();
listener = new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e) {
hide();
String str = (String) comboBox.getSelectedItem();
try {
Document doc = textArea.getDocument();
doc.insertString(textArea.getCaretPosition(), str, null);
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
};
if (Objects.nonNull(list)) {
list.addMouseListener(listener);
}
}
@Override public void uninstallingUI() {
if (Objects.nonNull(listener)) {
list.removeMouseListener(listener);
listener = null;
}
super.uninstallingUI();
}
@Override public boolean isFocusable() {
return true;
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、Shift+Tabでポップアップメニューが表示され、Up, Downキーで移動、EnterでJTextPane
のカーソルの後に選択された文字列が入力されます。
JComboBox
のポップアップ部分のUI
を表現するBasicComboPopup
を利用することで、スクロールバーをもつポップアップメニューを実現しています。
フォーカスを取得して、キー入力で選択を変更できるように、BasicComboPopup#isFocusable
メソッドをオーバーライドしています。また、BasicComboPopup#show
したあと、BasicComboPopup#requestFocusInWindow
する必要があります。
JFrame
から、ポップアップメニューがはみ出す(親Window
がHeavyWeightWindow
になる)場合、カーソルキーなどで、アイテムが移動選択できないバグがあったので、SwingUtilities.getWindowAncestor(popup).toFront();
を追加するなどの修正(Ubuntu
ではうまく動作しない?)をしました。
private void popupMenu(ActionEvent e) {
Rectangle rect = getMyPopupRect();
popup.show(jtp, rect.x, rect.y + rect.height);
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
SwingUtilities.getWindowAncestor(popup).toFront();
popup.requestFocusInWindow();
}
});
}
ただし、バージョン(6uN
?)、Web Start
などで実行すると、AccessControlException
が発生します。
Exception in thread "AWT-EventQueue-0" java.security.AccessControlException: access denied (java.awt.AWTPermission setWindowAlwaysOnTop)
- 上記の
AccessControlException
は、6u10 build b26
で修正されている