Java 动态更新JComboBox(NullPointerException)
我试图在swing应用程序中动态更新JComboBox,并获得一个空指针异常Java 动态更新JComboBox(NullPointerException),java,swing,nullpointerexception,jcombobox,comboboxmodel,Java,Swing,Nullpointerexception,Jcombobox,Comboboxmodel,我试图在swing应用程序中动态更新JComboBox,并获得一个空指针异常 class Accounts extends JPanel { JComboBox<String> accountSelect; DefaultComboBoxModel accountSelectModel; public Accounts() { this.initGUI(); } public void initGUI() { //setLayout etc
class Accounts extends JPanel {
JComboBox<String> accountSelect;
DefaultComboBoxModel accountSelectModel;
public Accounts() {
this.initGUI();
}
public void initGUI() {
//setLayout etc...
String[] al = {};//start empty
this.accountSelectModel = new DefaultComboBoxModel(al);
this.accountSelect = new JComboBox<String>();
this.accountSelect.setModel(accountSelectModel);
this.add(this.accountSelect);
}
public void updateComboBox(String[] al) {
//clear items and apply new
this.accountSelectModel = new DefaultComboBoxModel(al);
this.accountSelect.setModel(this.accountSelectModel);
}
public void removeComboBoxItems() {
//A call HERE here resorts in a null exception pointer ???
this.accountSelectModel.removeAllElements();
}
}
相反,我正在做:
class Accounts extends JPanel implements ActionListener
以及重写帐户内的actionPerformed方法
这解决了我的问题
更新2
然而,我更希望(以及其他人的建议)我不必使整个Accounts类成为ActionListener
所以我转到了original,发现问题在于每次调用this.accountSelectModel.removeAllElements都会在添加到this.accountSelect的内部AccountSelectListener中触发一个操作
监听器的目的是设置新的组合框选项,但由于在发生select更改时(但在removeAllElements上)没有调用该选项,因此对象源(项)为null,传递时抛出NPE。避免。特别是,检查您是否从帐户构造函数完成之前添加的侦听器调用removeComboxItems()
,如果您无法在上构造Swing GUI对象,则可能会发生这种情况。到时,accountSelectModel
的值为null
另一方面,JComboBox
监听其comboxmodel
,因此您不必替换该模型;只需将其更新到位。根据我的评论,您发布的代码没有显示NPE表明其来源在其他地方的原因。让我们看看调用代码,调用removeComboxItems()
方法的代码。它是在有效的帐户实例上调用它吗?另外,请考虑使用更少的<代码> < < /代码>。它会使您的代码变得不必要的冗长。\@hovercraftfullofels问道,“那么,基于上述代码,它怎么可能是null
”,默认值是null
;我猜在上构建帐户将在EDT上运行侦听器。此外,initGUI()
是public
并且可以随时调用。我知道问题不可能出现在您最初发布的代码中,但我仍然不确定新发布的代码是如何导致问题的。您的解决方案可能不是一个好的解决方案,因为您不应该让GUI类实现侦听器接口,除非您正在开发一个非常简单的玩具程序,因为它赋予类太多的责任,这可能会导致太多的耦合和不够的内聚。@lcplusplus:不可能。你没有很好地定义这个问题,我们无法给出解决方案。您尚未显示NPE的原因。使用外部监听器类本身并不会导致NPE的发生,事实上通常是这样。如果你创建并发布了一个复制你的问题的帖子,我99%相信我可以给你一个不错的解决方案。解决了这个问题(我已经更新了我的问题)。再次感谢您的反馈。我现在意识到您的回答在一定程度上解决了我与ComboBoxModel侦听器之间的问题,尽管我没有发布相关代码。因此,我接受你关于我的更新2的回答。感谢并感谢有益的讨论+1更新。
class Accounts extends JPanel implements ActionListener