JComboBox popup scrolling hide it

My client complains that JComboBox popups often close when a scroll is used over a JComboBox popup without a vertical scrollbar. (It seems he accidentally uses scrolling because he uses an Apple Magic mouse.)

How to prevent this?

I know this is related to ComboBoxUI, but I would like some pointers on where to start. BasicComboPopup.handler is private (not reused) and I don't see any code regarding any MouseWhellListener in BasicComboPopup.

+5
source share
4 answers

source, BasicPopupMenuUI MouseGrabber, AWTEventListener. MouseEvent.MOUSE_WHEEL eventDispatched() isInPopup(). .

show() actionPerformed() a JButton; . , , - ActionEvent.

, show() isPopupTrigger() MouseAdapter; , .

+6

combobox. , , . , .

, - , combobox , , . - , .

import java.awt.HeadlessException;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ComboBoxMouseWheel
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createGUI();
            }
        });
    }

    private static void createGUI() throws HeadlessException
    {
        String[] items = new String[]
        {
            "oasoas", "saas", "saasas"
        };
        final JComboBox jcb = new JComboBox(items);
        jcb.addMouseWheelListener(new MouseWheelListener()
        {
            @Override
            public void mouseWheelMoved(MouseWheelEvent e)
            {
                System.out.println("ohjasajs");
                e.consume();
                jcb.showPopup();
            }
        });
        JPanel p = new JPanel();
        p.add(jcb);
        JPanel contentPane = new JPanel();
        contentPane.add(p);
        JFrame f = new JFrame();
        f.setContentPane(contentPane);
        f.setSize(300, 300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

, . , , . , @trashgod, , :), , .

, .

+4

, , AWTEventListeners.

    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()
    {
        public void eventDispatched(AWTEvent event)
        {
            if (event instanceof MouseWheelEvent)
            {
                Object source = event.getSource();
                if ((source instanceof JScrollPane) &&
                    (((JScrollPane) source).getParent().getClass().
                       getName().equals("com.apple.laf.AquaComboBoxPopup")))
                {
                    JViewport viewport = ((JScrollPane) source).getViewport();
                    if (viewport.getViewSize().height <= viewport.getHeight())
                        // prevent consuming if there is a vertical scrollbar
                        ((MouseWheelEvent) event).consume();
                }
            }
        }
    }, AWTEvent.MOUSE_WHEEL_EVENT_MASK);

, !

+4

,

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
            public void eventDispatched(AWTEvent event) {
                if (event instanceof MouseWheelEvent) {
                    Object source = event.getSource();

                    if (source instanceof JScrollPane) {
                        JScrollPane scroll = (JScrollPane) source;
                        if (scroll.getName().equals("ComboBox.scrollPane")) {
                            MouseWheelEvent sourceEvent = ((MouseWheelEvent) event);

                            for (MouseWheelListener listener : scroll.getListeners(MouseWheelListener.class)) {
                                listener.mouseWheelMoved(sourceEvent);
                            }

                            sourceEvent.consume();
                        }
                    }


                }
            }
        }, AWTEvent.MOUSE_WHEEL_EVENT_MASK);
+1
source

All Articles