Java 顽固的JComboBox
我有一个JComboBox,如下面的代码所示。当程序启动时,它的actionPerformed事件立即触发,导致一些空指针异常,因此我希望在开始时不选择任何元素。但是,由于某些原因,它不起作用(无论我做什么,它总是从显示“USD/TRY”开始)。有人知道吗Java 顽固的JComboBox,java,swing,jcombobox,Java,Swing,Jcombobox,我有一个JComboBox,如下面的代码所示。当程序启动时,它的actionPerformed事件立即触发,导致一些空指针异常,因此我希望在开始时不选择任何元素。但是,由于某些原因,它不起作用(无论我做什么,它总是从显示“USD/TRY”开始)。有人知道吗 JComboBox comboBox = new JComboBox(new String[]{"USD/TRY", "EUR/TRY", "GBP/TRY"}); comboBox.setSelectedIndex(-1); // doe
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);
}
}
1) 添加而不是ActionListener
,但此itemsListener
始终触发两次事件SELECTED
和diselected
myComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
//some stuff
}
}
});
2) 您的GUI可能是在上创建的,也可能不是在上创建的,但在这种情况下并不重要,例如,您必须通过封装到invokeLater()来延迟此方法
public class MainFrame {
.
.
.
f.setPreferredSize(new Dimension(300, 300));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.add(p);
comboBox.setSelectedIndex(0);
f.setVisible(true);
selectDesiredItem();
}
private void selectDesiredItem() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
comboBox.setSelectedIndex(-1);
}
});
}
3) 更好的是货币对
4) 也许不重要,但CCYPAIR默认有四个方面
Buy BaseCcy
Sell BaseCcy
Buy variableCY
Sell variableCY
private boolean firevents=false
;考虑使它<代码>易失性< /代码> .fireXXX()
方法以检查fireEvents的状态firevents=true
comboBox.setSelectedIndex(0);
在显示之前,取消以前的任何设置。在添加侦听器之前设置所需的初始索引,不要忽略从开始,如下所示
在创建JComboBox之后尝试加载字符串[]?拥有异常的堆栈跟踪会有所帮助。如何将ActionListener添加到一个尚未创建的组合框中?您无法避免选择一个值,但即使这样,您的问题也显然存在于其他地方。actionPerformed处理程序究竟在什么情况下引发异常?您可能应该稍后在正确初始化完成后分配它,或者检查它的内部状态。我从来没有遇到过这个问题。发布您的演示问题的文章。窗口生成器不应更改任何内容。没有理由不能手动构建GUI。事实上,这是我推荐的方法,因为您学习的是Swing而不是GUI。您所要做的就是阅读JComboxAPI,并按照Swing教程的链接,在
如何使用组合框
中找到一个工作示例。谢谢。其他答案在一定程度上解决了问题,但仍然存在一些问题,但这一个完全解决了问题。我认为主要问题是缺少用于构建框架的invokeLater函数(即:从EDT开始);我总是对揭露EDT问题的新方法感兴趣。@Cemre,你读过API和教程吗???教程中的示例正确地使用了EDT,这就是为什么我在几个小时前向您指出了教程。@camickr由于某种原因,您的链接不起作用,因此我当时无法检查它,对此表示抱歉。我将谷歌和研究它现在。我对swing有点陌生,所以我没有意识到EDT的重要性。谢谢你的帮助。@Cemre,我没有给你链接。我希望您能够阅读API并自己点击链接。如果你是Swing新手,那么这就是按照建议阅读教程的更多理由,而不是希望有人为你编写代码。非常感谢你的详细回答。我真的很感激。虽然您的第二个建议解决了组合框错误,但我仍然遇到空指针异常。@kleopatra新年快乐-1当事情真的很复杂时,主要是因为应用程序代码出错。因此,与随机的不雅子类化、古怪的标志或混乱的覆盖不同,第一步是挖掘和理解具体上下文中的错误并修复它
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class MainFrame {
private final JTextArea textArea = new JTextArea();
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new MainFrame();
}
});
}
public MainFrame() {
//build gui
final JComboBox comboBox = new JComboBox();
comboBox.addItem("USD/TRY");
comboBox.addItem("EUR/TRY");
comboBox.addItem("GBP/TRY");
JFrame f = new JFrame("Currency Converter");
JPanel p = new JPanel(new BorderLayout());
textArea.setName("textarea");
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
comboBox.setSelectedIndex(-1);
comboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(comboBox.getSelectedItem() + ": " + e);
}
});
p.add(comboBox, BorderLayout.NORTH);
p.add(textArea, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setSize(new Dimension(300, 300));
f.add(p);
f.setVisible(true);
}
}