Немного странное поведение 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();
}
});