【问题标题】:java - Refreshing JComboBox throws exceptionjava - 刷新 JComboBox 抛出异常
【发布时间】:2013-12-13 00:37:05
【问题描述】:

我有一个组合框,它使用带有监听器的模型来捕获所选项目:

deleteCombo = new JComboBox<Course>(course.toArray(new Course[course.size()]));
model = new DefaultComboBoxModel<Course>( course.toArray(new Course[course.size()]) );
deleteCombo.setModel( model );
deleteCombo.setRenderer(renderer);
deleteCombo.setSelectedIndex(0);
deleteCombo.addActionListener( new ActionListener() {

    public void actionPerformed(ActionEvent e)
    {
        JComboBox deleteCombo = (JComboBox)e.getSource();
        Course course = (Course)deleteCombo.getSelectedItem();
        deleteNumTxt.setText( course.getCourseNum() ); //This is line 391
        deleteTitleTxt.setText( course.getCourseTitle() );
        deleteDurationTxt.setText( String.valueOf(course.getDuration() ) );
        deleteFeeTxt.setText("$" + String.valueOf(course.getCourseFee() ) );
        deleteLevelTxt.setText( course.getCourseLevel() );
    }
});

我正在使用 itemSelected 事件来填充 GUI 中的文本字段,以显示所选课程的详细信息。选择课程并单击“删除课程”按钮后,将转到此方法:

public static void deleteCourseRecord() {
courseNumIn = deleteNumTxt.getText();
int index = course.indexOf(new Course(courseNumIn));
course.remove(index);

//RE-POPULATE EDIT AND DELETE COMBOBOXES
model.removeAllElements();
for(Course item : course) {
    model.addElement(item);
    }
}

记录被删除但抛出此异常:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MyCourse$2.actionPerformed(MyCourse.java:391)
at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1260)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1331)
at javax.swing.JComboBox.intervalRemoved(JComboBox.java:1351)
at javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:179)
at javax.swing.DefaultComboBoxModel.removeAllElements(DefaultComboBoxModel.java:175)
at MyCourse$Course.deleteCourseRecord(MyCourse.java:1138)
at MyCourse.actionPerformed(MyCourse.java:883)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
tjavax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)

我认为构建 actionPerformed 部分的方式存在问题,但我不知道它是什么。如果我不使用模型(或任何其他方法)刷新组合框,它不会抛出异常。如果我注释掉第 391 行(在代码中标记),它将在第 392 行抛出异常,依此类推。如果填充文本字段的所有代码行都被注释掉,它不会抛出异常,但当然,函数会丢失。关于我做错了什么的任何想法?干杯

【问题讨论】:

  • 第 391 行是哪一行
  • deleteNumTxt.setText(course.getCourseNum()); //这是第391行
  • 那么 deleteNumTxt 或 course 没有被实例化。 deleteNumTxt 设置在哪里?从您发布的代码看起来它是空的
  • course 定义在哪里?
  • 对不起,我只发布了我认为相关的部分。它在组合框上方设置了许多行。当我不使用任何刷新组合框的方法时,代码可以工作,但会导致其他问题,例如在编辑功能中。

标签: java swing actionlistener jcombobox


【解决方案1】:

问题如下:

每次更改设置为组合框的模型时,都会调用动作侦听器。

所以当你这样做时:

//RE-POPULATE EDIT AND DELETE COMBOBOXES
model.removeAllElements();

actionlistener 被执行并且

Course course = (Course)deleteCombo.getSelectedItem();

为空,因为您刚刚从组合框中删除了所有元素。

如果你试试这个简单的例子,你会看到:

public static void main(String[] args) 
    String [] s = {"1", "2"};
    DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>(s);
    JComboBox<String> j = new JComboBox<String>(s);
    j.setModel(model);

    j.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println(((JComboBox) arg0.getSource()).getSelectedItem());               
        }
    });

    JFrame jf = new JFrame();
    jf.add(j);
    jf.setVisible(true);
    jf.setSize(100, 100);

    model.removeAllElements();
}

它将输出null

【讨论】:

  • 我试过你的例子,你是正确的,现在你已经解释了它是有道理的。我认为 for 循环会处理它,因为它会重建组合框,不是吗?有解决办法吗?谢谢
  • 在对模型进行操作之前,您可以将布尔类属性 removing 设置为 true。然后在 actionlistener 中检查 removing,仅在 removing 为 false 时执行侦听器代码。
  • 干得好,伙计!奇迹般有效。感谢您的时间。干杯
猜你喜欢
  • 2019-12-19
  • 1970-01-01
  • 2012-02-14
  • 2012-07-23
  • 2017-11-10
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多