Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态更新JComboBox(NullPointerException)_Java_Swing_Nullpointerexception_Jcombobox_Comboboxmodel - Fatal编程技术网

Java 动态更新JComboBox(NullPointerException)

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

我试图在swing应用程序中动态更新JComboBox,并获得一个空指针异常

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