Swing/BasicComboPopup のバックアップの現在との差分(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - 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)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JComboBoxを使ってポップアップメニューをスクロール #navi(../) *JComboBoxを使ってポップアップメニューをスクロール [#cc8b9df3] >編集者:[[Terai Atsuhiro>terai]]~ 作成日:2005-10-17~ 更新日:&lastmod; --- category: swing folder: BasicComboPopup title: JComboBoxを使ってポップアップメニューをスクロール tags: [BasicComboPopup, JTextPane, JComboBox] author: aterai pubdate: 2005-10-17T19:42:35+09:00 description: JComboBoxを使ってスクロール可能なポップアップメニューを表示します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTH_tpIbsI/AAAAAAAAASE/DrHgihVbnn0/s800/BasicComboPopup.png --- * 概要 [#summary] `JComboBox`を使ってスクロール可能なポップアップメニューを表示します。 #contents #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTH_tpIbsI/AAAAAAAAASE/DrHgihVbnn0/s800/BasicComboPopup.png) **概要 [#ya56951b] JComboBoxを使ってスクロール可能なポップアップメニューを表示します。 * サンプルコード [#sourcecode] #code(link){{ class EditorComboPopup extends BasicComboPopup { private final JTextComponent textArea; private transient MouseAdapter listener; protected EditorComboPopup(JTextComponent textArea, JComboBox cb) { super(cb); this.textArea = textArea; } #screenshot @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); } } **サンプルコード [#q28e6ef6] #code{{ JComboBox combo = new JComboBox(strArray); BasicComboPopup popup = new BasicComboPopup(combo) { public boolean isFocusable() { @Override public void uninstallingUI() { if (Objects.nonNull(listener)) { list.removeMouseListener(listener); listener = null; } super.uninstallingUI(); } @Override public boolean isFocusable() { return true; } protected void installListListeners() { super.installListListeners(); list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { append((String)combo.getSelectedItem()); } }); } }; } }} -&jnlp; -&jar; -&zip; **解説 [#z7e217c3] 上記のサンプルでは、Shift+Tabでポップアップメニューが表示され、上下キーで移動、EnterでJTextPaneのカーソルの後に選択された文字列が入力されます。 * 解説 [#explanation] 上記のサンプルでは、KBD{Shift+Tab}でポップアップメニューが表示され、KBD{Up}・KBD{Down}キーで移動、KBD{Enter}で`JTextPane`のカーソルの後に選択された文字列が入力されます。 コンボボックスのポップアップ部分のUIを表現するBasicComboPopupを利用することで、スクロールバーをもつポップアップメニューを実現しています。 `JComboBox`のポップアップ部分の`UI`を表現する`BasicComboPopup`を利用することで垂直スクロールバーありのポップアップメニューを実現しています。 フォースを取得して、キー入力で選択を変更できるように、%%BasicComboPopup#isFocusTraversable%% BasicComboPopup#isFocusableメソッドをオーバーライドしています。また、BasicComboPopup#showしたあと、BasicComboPopup#requestFocusInWindowする必要があります。 - フォーカスを取得してキー入力で選択を変更できるように`BasicComboPopup#isFocusable`メソッドをオーバーライド -- `BasicComboPopup#show()`を実行した後`BasicComboPopup#requestFocusInWindow()`を呼びだす必要がある JFrameから、ポップアップメニューがはみ出す(親WindowがHeavyWeightWindowになる)場合、カーソルキーなどで、アイテムが移動選択できないバグがあったので、SwingUtilities.getWindowAncestor(popup).toFront();を追加するなどの修正をしました。 ---- - %%`JFrame`から、ポップアップメニューがはみ出す(親`Window`が`HeavyWeightWindow`になる)場合、カーソルキーなどで、アイテムが移動選択できないバグがある%% -- `SwingUtilities.getWindowAncestor(popup).toFront();`を追加して修正(`Ubuntu`ではうまく動作しない?) #code{{ private void popupMenu(ActionEvent e) { Rectangle rect = getMyPopupRect(); popup.show(jtp, rect.x, rect.y + rect.height); EventQueue.invokeLater(new Runnable() { public void run() { @Override public void run() { SwingUtilities.getWindowAncestor(popup).toFront(); popup.requestFocusInWindow(); } }); } }} #screenshot(,screenshot2.png) #ref(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTICNIyr1I/AAAAAAAAASI/CorNUGA0pF8/s800/BasicComboPopup1.png) **参考リンク [#ieff35f1] -[[Scrollable PopupMenu>http://forum.java.sun.com/thread.jspa?threadID=483165]] - %%ただし、バージョン(`6uN`?)、`Web Start`などで実行すると、`AccessControlException`が発生する%% -- `Exception in thread "AWT-EventQueue-0" java.security.AccessControlException: access denied (java.awt.AWTPermission setWindowAlwaysOnTop)` - 上記の`AccessControlException`は、`6u10 build b26`で修正されている -- [https://bugs.openjdk.org/browse/JDK-6675802 Bug ID: 6675802 Regression: heavyweight popups cause SecurityExceptions in applets] **コメント [#c9eef0fd] - 大変参考になりました。その上、マウスクリックで文字列を選定できるようにしたいですが、どうすればいかがですか? -- [[java]] &new{2008-01-08 (火) 16:25:30}; -- どうもです。とりあえず((以前は、マウスクリックでも動作していたと思うのですが、勘違いだったのかも…?。))、手抜きですが、BasicComboPopup#installListListenersメソッドをオーバーライドしてマウスリスナーを追加してみました。 -- [[terai]] &new{2008-01-08 (火) 18:23:22}; - 助かりました!感動です!ご回答ありがとうございました。 -- [[java]] &new{2008-01-10 (木) 17:38:04}; * 参考リンク [#reference] - [https://community.oracle.com/thread/1367473 Swing - Scrollable PopupMenu] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/plaf/basic/BasicComboPopup.html BasicComboPopup (Java Platform SE 8)] * コメント [#comment] #comment - 大変参考になりました。その上、マウスクリックで文字列を選定できるようにしたいですが、どうすればいかがですか? -- &user(java); &new{2008-01-08 (火) 16:25:30}; -- どうもです。とりあえず(勘違いしているかもしれませんが、以前はマウスクリックでも動作していたような…?)、手抜きですが、`BasicComboPopup#installListListeners`メソッドをオーバーライドしてマウスリスナーを追加してみました。 -- &user(aterai); &new{2008-01-08 (火) 18:23:22}; - 助かりました!感動です!ご回答ありがとうございました。 -- &user(java); &new{2008-01-10 (木) 17:38:04}; - こんにちは。いつもこのサイトを参考にさせていただいています。ようやく自分の`java`アプリケーションをリリースしました(http://www.jdbckit.com まだ更新中ですが、)。次回のバージョンアップで、`Special Thanks`をバージョン情報画面に設けて、Terai Atsuhiro様のサイトを感謝対象にさせてよろしいでしょうか? -- &user(java); &new{2008-02-22 (金) 15:13:04}; -- こんばんは。どうもです。おお、おめでとうございます。リンクの件はご自由にどうぞ。 -- &user(aterai); &new{2008-02-22 (金) 17:00:18}; -- 余談: ドキュメントに何か書く必要があるのって、`Apache Software License`でしたっけ?基本的(引用先を強調している`Tips`を除く)に、このサイトの`Tips`は、ちいさなサンプルを目指しているため、コピペしても単独ではあまり役に立たないものが多く、完全に無保証なので、ライセンスなどは気しなくても良いです。 -- &user(aterai); &new{2008-02-22 (金) 17:01:08}; #comment