Swing/DisableRightClick のバックアップ(No.21)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DisableRightClick へ行く。
- 1 (2009-06-29 (月) 10:14:32)
- 2 (2009-06-29 (月) 15:24:05)
- 3 (2009-07-10 (金) 14:40:52)
- 4 (2011-05-10 (火) 23:25:48)
- 5 (2011-05-20 (金) 15:51:37)
- 6 (2012-04-24 (火) 18:28:39)
- 7 (2012-04-24 (火) 19:28:45)
- 8 (2013-01-09 (水) 20:44:55)
- 9 (2013-05-03 (金) 23:49:12)
- 10 (2013-08-20 (火) 14:36:40)
- 11 (2014-11-01 (土) 00:46:09)
- 12 (2014-11-26 (水) 16:59:53)
- 13 (2014-11-30 (日) 00:51:50)
- 14 (2015-05-07 (木) 15:59:46)
- 15 (2017-03-09 (木) 16:37:10)
- 16 (2017-06-07 (水) 15:35:06)
- 17 (2017-11-02 (木) 15:34:40)
- 18 (2018-01-11 (木) 18:08:15)
- 19 (2018-02-24 (土) 19:51:30)
- 20 (2018-12-07 (金) 15:18:28)
- 21 (2019-05-22 (水) 19:35:38)
- 22 (2020-03-16 (月) 00:39:33)
- 23 (2021-06-13 (日) 01:25:41)
- 24 (2022-08-20 (土) 22:15:25)
- category: swing
folder: DisableRightClick
title: JComboBoxのドロップダウンリストで右クリックを無効化
tags: [JComboBox, BasicComboPopup, MouseListener, JList]
author: aterai
pubdate: 2009-06-29T10:14:32+09:00
description: JComboBoxのドロップダウンリスト(ポップアップメニュー)で、マウスの右クリックを無効にします。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2009/06/disable-right-click-in-jcombobox.html lang: en
概要
JComboBox
のドロップダウンリスト(ポップアップメニュー)で、マウスの右クリックを無効にします。
Screenshot
Advertisement
サンプルコード
class BasicComboPopup2 extends BasicComboPopup {
private transient Handler2 handler2;
@Override public void uninstallingUI() {
super.uninstallingUI();
handler2 = null;
}
public BasicComboPopup2(JComboBox combo) {
super(combo);
}
@Override protected MouseListener createListMouseListener() {
if (handler2 == null) {
handler2 = new Handler2();
}
return handler2;
}
private class Handler2 extends MouseAdapter {
@Override public void mouseReleased(MouseEvent e) {
if (e.getSource().equals(list)) {
if (list.getModel().getSize() > 0) {
// <ins>
if (!SwingUtilities.isLeftMouseButton(e) || !comboBox.isEnabled()) {
return;
}
// </ins>
// JList mouse listener
if (comboBox.getSelectedIndex() == list.getSelectedIndex()) {
comboBox.getEditor().setItem(list.getSelectedValue());
}
comboBox.setSelectedIndex(list.getSelectedIndex());
}
comboBox.setPopupVisible(false);
// workaround for cancelling an edited item (bug 4530953)
if (comboBox.isEditable() && comboBox.getEditor() != null) {
comboBox.configureEditor(comboBox.getEditor(), comboBox.getSelectedItem());
}
}
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、ComboBoxUI#createPopup()
をオーバーライドして、ドロップダウンリストに設定するMouseListener
を入れ替えたBasicComboPopup
を追加しています。
combo02.setUI(new BasicComboBoxUI() {
@Override protected ComboPopup createPopup() {
return new BasicComboPopup2(comboBox);
}
});
元のMouseListener
は、JComboBox
全体のHandler
になっていますが、必要なのはドロップダウンリスト関係のみなので、e.getSource() == list
な部分だけ元のHandler
からコピーし、この中でif(!SwingUtilities.isLeftMouseButton(e) || !comboBox.isEnabled()) return;
と右クリックを無視しています。
以下のような方法もあります。
class BasicComboPopup3 extends BasicComboPopup {
@SuppressWarnings("unchecked")
@Override protected JList createList() {
return new JList(comboBox.getModel()) {
@Override public void processMouseEvent(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
return;
}
MouseEvent ev = e;
if (e.isControlDown()) {
// Fix for 4234053. Filter out the Control Key from the list.
// ie., don't allow CTRL key deselection.
Toolkit toolkit = Toolkit.getDefaultToolkit();
ev = new MouseEvent(e.getComponent(), e.getID(), e.getWhen(),
//e.getModifiers() ^ InputEvent.CTRL_MASK,
e.getModifiers() ^ toolkit.getMenuShortcutKeyMask(),
e.getX(), e.getY(),
e.getXOnScreen(), e.getYOnScreen(),
e.getClickCount(),
e.isPopupTrigger(),
MouseEvent.NOBUTTON);
}
super.processMouseEvent(ev);
}
};
}
}
参考リンク
- JDK-4249731 JComboBox (Windows L&F), right mouse click selects in menu - Java Bug System
- 要望が矛盾しているとして却下されているが、もしかしたら「
Windows
環境の標準動作に合わせて、WindowsLookAndFeel
のJComboBox
では右クリックしてもドロップダウンリストを閉じないようにして欲しい」との意味だったのかもしれない
- 要望が矛盾しているとして却下されているが、もしかしたら「