【发布时间】:2012-01-04 16:19:31
【问题描述】:
我有一个 JComboBox,如下面的代码所示。当程序启动时,它的 actionPerformed 事件立即触发,导致一些空指针异常,所以我想从没有选择任何元素开始。但是,由于某种原因,它不起作用(无论我做什么,它总是从显示“USD/TRY”开始)。有人知道吗?
JComboBox comboBox = new JComboBox(new String[]{"USD/TRY", "EUR/TRY", "GBP/TRY"});
comboBox.setSelectedIndex(-1); // doesnt change anything
comboBox.setSelectedIndex(2); // doesnt change anything
comboBox.setSelectedItem(null); // doesnt change anything
更新:像下面这样构建组合框也不会改变任何东西
JComboBox comboBox = new JComboBox();
comboBox.addItem("USD/TRY");
comboBox.addItem("EUR/TRY");
comboBox.addItem("GBP/TRY");
这里是 SSCCE:
public class MainFrame {
private final JTextArea textArea = new JTextArea();
private IExchangeSource s;
public MainFrame(final IExchangeSource s) {
//build gui
final JComboBox comboBox = new JComboBox();
comboBox.addItem("USD/TRY");
comboBox.addItem("EUR/TRY");
comboBox.addItem("GBP/TRY");
comboBox.setSelectedIndex(-1); // doesnt change anything
//comboBox.setSelectedIndex(2); // doesnt change anything
JFrame f = new JFrame("Currency Converter");
JPanel p = new JPanel(new BorderLayout());
textArea.setName("textarea");
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
this.s = s;
comboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String exchange = (String) comboBox.getSelectedItem();
s.getData(exchange);
}
});
p.add(comboBox, BorderLayout.NORTH);
p.add(textArea, BorderLayout.CENTER);
f.setPreferredSize(new Dimension(300, 300));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.add(p);
comboBox.setSelectedIndex(0);
f.setVisible(true);
}
}
【问题讨论】:
-
在创建 JComboBox 后尝试加载 String[]?
-
拥有异常的堆栈跟踪会有所帮助。如何将 ActionListener 添加到尚未创建的组合框?
-
你无法避免选择一个值,但即便如此,很明显你的问题出在其他地方。 actionPerformed 处理程序究竟在什么上抛出异常?您可能应该稍后在正确初始化完成后分配它,或者检查它内部的状态。
-
我从来没有遇到过这个问题。发布您的 SSCCE 来证明问题。
-
窗口构建器不应该改变任何东西。您没有理由不能手动构建 GUI。事实上,这是我推荐的方法,因为您学习的是 Swing 而不是 GUI。您所要做的就是阅读 JComboBox API 并点击
How to Use Combo Boxes上的 Swing 教程链接以获取工作示例。