Swing/BasicComboPopup のバックアップの現在との差分(No.7)
TITLE:JComboBoxを使ってポップアップメニューをスクロール
JComboBoxを使ってポップアップメニューをスクロール
Posted by terai at 2005-10-17- category: swing folder: BasicComboPopup title: JComboBoxを使ってポップアップメニューをスクロール tags: [BasicComboPopup, JTextPane, JComboBox] author: aterai pubdate: 2005-10-17T19:42:35+09:00 description: JComboBoxを使ってスクロール可能なポップアップメニューを表示します。 image:
概要
JComboBox
を使ってスクロール可能なポップアップメニューを表示します。
Screenshot
Advertisement
概要
JComboBoxを使ってスクロール可能なポップアップメニューを表示します。サンプルコード
#spanend
#spanadd
class EditorComboPopup extends BasicComboPopup {
#spanend
private final JTextComponent textArea;
private transient MouseAdapter listener;
protected EditorComboPopup(JTextComponent textArea, JComboBox cb) {
super(cb);
this.textArea = textArea;
}
-&jnlp;
-&jar;
-&zip;
@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);
}
}
#spandel
#screenshot
#spanend
@Override public void uninstallingUI() {
if (Objects.nonNull(listener)) {
list.removeMouseListener(listener);
listener = null;
}
super.uninstallingUI();
}
#spandel
**サンプルコード [#q28e6ef6]
#spanend
#spandel
#code{{
#spanend
#spandel
JComboBox combo = new JComboBox(strArray);
#spanend
#spandel
BasicComboPopup popup = new BasicComboPopup(combo) {
#spanend
public boolean isFocusable() {
@Override public boolean isFocusable() {
return true;
}
protected void installListListeners() {
super.installListListeners();
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
append((String)combo.getSelectedItem());
}
});
}
#spandel
};
#spanend
#spanadd
}
#spanend
View in GitHub: Java, Kotlin解説
上記のサンプルでは、Shift+Tabでポップアップメニューが表示され、上下キーで移動、EnterでJTextPaneのカーソルの後に選択された文字列が入力されます。解説
上記のサンプルでは、Shift+Tabでポップアップメニューが表示され、Up・Downキーで移動、EnterでJTextPane
のカーソルの後に選択された文字列が入力されます。
コンボボックスのポップアップ部分のUIを表現するBasicComboPopupを利用することで、スクロールバーをもつポップアップメニューを実現しています。
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() { public void run() { @Override public void run() { SwingUtilities.getWindowAncestor(popup).toFront(); popup.requestFocusInWindow(); } }); }
#screenshot(,screenshot2.png)
-
参考リンク
- Scrollable PopupMenu
-
ただし、バージョン(6uN
?)、Web Start
などで実行すると、AccessControlException
が発生する-
Exception in thread "AWT-EventQueue-0" java.security.AccessControlException: access denied (java.awt.AWTPermission setWindowAlwaysOnTop)
-
- 上記の
AccessControlException
は、6u10 build b26
で修正されている
コメント
- 大変参考になりました。その上、マウスクリックで文字列を選定できるようにしたいですが、どうすればいかがですか? -- java?
- 助かりました!感動です!ご回答ありがとうございました。 -- java?
- こんにちは。いつもこのサイトを参考にさせていただいています。ようやく自分のjavaアプリケーションをリリースしました(http://www.jdbckit.com まだ更新中ですが、)。次回のバージョンアップで、Special Thanksをバージョン情報画面に設けて、Terai Atsuhiro様のサイトを感謝対象にさせてよろしいでしょうか? -- java?