JComboBox фокус и события мыши не работают - PullRequest
6 голосов
/ 01 июня 2011

Редактировать
Downvoter, как это плохой вопрос?Я предоставил работающий пример кода проблемы.Если это работает для вас, пожалуйста, дайте мне знать или укажите, что неясно.

Здравствуйте,
в приведенном ниже коде, который имеет JComboBox в JFrame, яуведомляется, когда мышь входит в JComboBox или щелкается, или фокус получен.Тем не менее, PopupMenuEvent работает правильно.

Что я делаю не так?(Моя цель - получать уведомления при щелчке текстового компонента JComboBox)

public class TestJComboBox extends javax.swing.JFrame
{
    public TestJComboBox()
    {
        initComponents();
    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jComboBox1 = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                formMouseClicked(evt);
            }
        });

        jComboBox1.setEditable(true);
        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBox1.setName("jComboBox1"); // NOI18N
        jComboBox1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jComboBox1MouseClicked(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                jComboBox1MouseEntered(evt);
            }
        });
        jComboBox1.addPopupMenuListener(new javax.swing.event.PopupMenuListener() {
            public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) {
            }
            public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
            }
            public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {
                jComboBox1PopupMenuWillBecomeVisible(evt);
            }
        });
        jComboBox1.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBox1FocusGained(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(70, 70, 70)
                .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 226, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(104, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(90, 90, 90)
                .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(164, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void jComboBox1FocusGained(java.awt.event.FocusEvent evt)
    {
        System.out.println("JComboBox Focus gained");
    }

    private void formMouseClicked(java.awt.event.MouseEvent evt)
    {
        System.out.println("Form clicked");
        jComboBox1.setFocusable(false);
        jComboBox1.setFocusable(true);
    }

    private void jComboBox1MouseClicked(java.awt.event.MouseEvent evt)
    {
        System.out.println("JComboBox Click");
    }

    private void jComboBox1PopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt)
    {
        System.out.println("JComboBox Visible menu");
    }

    private void jComboBox1MouseEntered(java.awt.event.MouseEvent evt)
    {
        System.out.println("Entered JComboBox");
    }

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new TestJComboBox().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JComboBox jComboBox1;
    // End of variables declaration
}

Спасибо!

Ответы [ 2 ]

7 голосов
/ 02 июня 2011

Возможно, downvoter обиделся на использование редактора графического интерфейса Netbeans.Мне самому это не нравится, но вы можете использовать его, если обнаружите, что на самом деле можете поддерживать сложный графический интерфейс с ним.Я лично ненавижу это из-за различных чрезвычайно раздражающих ошибок, которые проявляются только тогда, когда вы пытаетесь редактировать форму, и она незаметно теряет ваш макет и настройки компонента.Но это не относится к делу.

В любом случае вам нужно добавить свой ActionListener следующим образом:

jComboBox1.getEditor().getEditorComponent().addMouseListener(...);

JComboBox действительно составной компонент с JTextField, JButton и JList, скрытым внутри него,поэтому вы добавляете ActionListener в компонент обтекания, когда события мыши действительно передаются во внутренний JTextField.

0 голосов
/ 22 февраля 2017

Не забывайте, что comboBox на самом деле является контейнером. Поэтому, если вы действительно хотите иметь все события мыши, вы должны добавить слушатель ко всем компонентам, которые он содержит.


public void addMouseListener(final MouseListener mouseListener) {
    this.comboBox.addMouseListener(mouseListener);

    final Component[] components = this.comboBox.getComponents();
    for(final Component component : components) {
        component.addMouseListener(mouseListener);
    }
    this.comboBox.getEditor().getEditorComponent().addMouseListener(mouseListener);
}

Пожалуйста, посетите слушатели колеблющейся мыши, перехваченные дочерними компонентами для более подробной информации.

...