JComboBoxのドロップダウンリストで右クリックを無効化
Total: 7703
, Today: 2
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JComboBox
のドロップダウンリスト(ポップアップメニュー)で、マウスの右クリックを無効にします。
Screenshot
Advertisement
サンプルコード
class BasicComboPopup2 extends BasicComboPopup {
private transient Handler2 handler2;
public BasicComboPopup2(JComboBox combo) {
super(combo);
}
@Override public void uninstallingUI() {
super.uninstallingUI();
handler2 = null;
}
@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
では右クリックしてもドロップダウンリストを閉じないようにして欲しい」との意味だったのかもしれない
- 要望が矛盾しているとして却下されているが、もしかしたら「
- JMenuとJMenuItemで右クリックによる選択を無効にする
JMenu
とJMenuItem
も同様にマウス右クリックの無効化が可能