有点奇怪的 JComboBox 行为
Slightly Odd JComboBox Behavior
下面是我正在处理的更大 GUI 的简化部分代码。我看到 JComboBox
有一些奇怪的行为。要重现问题,运行 代码并且不触及任何其他内容,请单击“切换”按钮。正如预期的那样,JComboBox
中显示的值将发生变化。现在,不要触及任何其他内容,单击 JComboBox
中的“向下箭头”。它的下拉滚动窗格将出现,但所选值(“Jan”)不会出现在可见部分。它看起来像这样:
现在,无需触摸任何其他内容,单击 GUI 的空白部分即可使滚动窗格消失。现在,再次单击“向下箭头”。这次所选值将位于滚动窗格的可见部分。它看起来像这样:
知道为什么会这样吗?
谢谢。
代码如下:
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();
}
});
}
}
我也可以使用 JDK7 重现该问题。我没有发现您的代码有任何问题,因为所有组件都是在 EDT 上创建的。我建议这是一个错误。
在第一次显示弹出窗口之前,滚动似乎有问题。
我添加了以下代码,它现在似乎可以工作了:
add(myCombo);
add(myButton);
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
myCombo.showPopup();
myCombo.hidePopup();
}
});
下面是我正在处理的更大 GUI 的简化部分代码。我看到 JComboBox
有一些奇怪的行为。要重现问题,运行 代码并且不触及任何其他内容,请单击“切换”按钮。正如预期的那样,JComboBox
中显示的值将发生变化。现在,不要触及任何其他内容,单击 JComboBox
中的“向下箭头”。它的下拉滚动窗格将出现,但所选值(“Jan”)不会出现在可见部分。它看起来像这样:
现在,无需触摸任何其他内容,单击 GUI 的空白部分即可使滚动窗格消失。现在,再次单击“向下箭头”。这次所选值将位于滚动窗格的可见部分。它看起来像这样:
知道为什么会这样吗? 谢谢。
代码如下:
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();
}
});
}
}
我也可以使用 JDK7 重现该问题。我没有发现您的代码有任何问题,因为所有组件都是在 EDT 上创建的。我建议这是一个错误。
在第一次显示弹出窗口之前,滚动似乎有问题。
我添加了以下代码,它现在似乎可以工作了:
add(myCombo);
add(myButton);
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
myCombo.showPopup();
myCombo.hidePopup();
}
});