Немного странное поведение JComboBox

Ниже приведен код для упрощенной части большого графического интерфейса, над которым я работаю. Я вижу немного странное поведение JComboBox, Чтобы воссоздать проблему, запустите код и, не касаясь ничего другого, нажмите кнопку "Переключить". Как и ожидалось, значение отображается в JComboBox изменится. Теперь, не касаясь ничего другого, нажмите на кнопку "стрелка вниз" в JComboBox, Появится его раскрывающаяся панель прокрутки, но выбранное значение ("Jan") не будет отображаться в видимой части. Это будет выглядеть так:

Теперь, не касаясь ничего другого, щелкните в пустом разделе графического интерфейса, чтобы область прокрутки исчезла. Теперь снова нажмите "стрелку вниз". На этот раз выбранное значение будет в видимой части панели прокрутки. Это будет выглядеть так:

Есть идеи, почему это происходит? Благодарю.

Вот код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ComboBoxIssue extends JPanel {
    private JComboBox myCombo; 
    private JButton myButton;
    private boolean state = true;
    public ComboBoxIssue() {
        super(new FlowLayout());
        myCombo = new JComboBox();
        myCombo.setModel(new DefaultComboBoxModel<>(new String[] {"Jan",
                "Feb", "March", "April", "May", "June", "July", "Aug", "Sept",
                "Oct", "Nov", "Dec"}));
        myCombo.setSelectedItem("Dec");
        myCombo.setMaximumRowCount(5);
        myButton = new JButton("Toggle");
        myButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (state) {
                    state = false;
                    myCombo.setSelectedItem("Jan");        
                } else {
                    state = true;
                    myCombo.setSelectedItem("Dec");     
                }
            }     
        });
        add(myCombo);
        add(myButton);
    }
    private static void setLookAndFeel() {
        try {
            UIManager.setLookAndFeel(
                "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
            );
        } catch (Exception exc) {
            // ignore error
        }
    }
    private static void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        JComponent newContentPane = new ComboBoxIssue();
        frame.add(newContentPane);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        setLookAndFeel();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGui();
            }
        });
    } 
}

1 ответ

Решение

Я также могу продублировать проблему, используя JDK7. Я не вижу ничего плохого в вашем коде, так как все компоненты созданы на EDT. Я бы предположил, что это ошибка.

Похоже, есть проблема с прокруткой, пока всплывающее окно не было отображено в первый раз.

Я добавил следующий код, и теперь он работает:

add(myCombo);
add(myButton);

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        myCombo.showPopup();
        myCombo.hidePopup();
    }
});
Другие вопросы по тегам