代码之家  ›  专栏  ›  技术社区  ›  James P. PachinSV

异常似乎扼杀了JList的更新

  •  0
  • James P. PachinSV  · 技术社区  · 14 年前

    每当选择一个项目时,我都使用ActionListener来更新JList。

    jComboBox.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JComboBox cb = (JComboBox) e.getSource();
            updateLocalFileList( cb.getSelectedItem().toString() );
        }
    });
    

    它正在为UI调用此方法。

    public void updateLocalFileList( String path ){
        DefaultListModel model = new DefaultListModel();
        for (String str : LocalFileSystem.getFileListFromDirectory( path )) {
            model.addElement( str );
        }
        getJList().setModel(model);
    }
    

    我不确定到底发生了什么,但我怀疑向模型传递null值会导致这个问题。

    编辑

    这是所要求的stacktrace。如您所见,该方法显然在不可访问的驱动器上触发了NullPointerException。我不清楚为什么它会阻止JList更新,因为应用程序的其余部分工作正常。

    java.lang.NullPointerException
        at mine.View.updateLocalFileList(View.java:274)
        at mine.View$1.actionPerformed(View.java:262)
        at javax.swing.JComboBox.fireActionEvent(Unknown Source)
        at javax.swing.JComboBox.setSelectedItem(Unknown Source)
        at javax.swing.JComboBox.setSelectedIndex(Unknown Source)
        at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(Unknown Source)
        at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
    
    4 回复  |  直到 14 年前
        1
  •  2
  •   mdma    14 年前

    我会做两件事让它更强大。

    1. 确保getFileListFromDirectory从不返回null。如果没有物品,请退货 Collections.emptyList 而不是空的。如果不可能,在使用“for each”迭代之前,请特别检查返回值。此时,空指针将阻止模型更新(因此,单击空驱动器不会清除文件列表。)
    2. 将cb.getSelectedItem()赋给局部变量,并在调用updateLocalFileList之前检查是否为null。如果cb.getSelectedItem()为空,则可以选择清除文件列表。
        2
  •  1
  •   user268396    14 年前

    NullPointerException发生在EventDispatchThread上(这是所有GUI更新代码通常发生的地方),因此它会中断事件侦听器本身。因此,您的GUI不会得到正确更新(不再)。为了防止这种情况发生,您必须显式地处理异常,或者拦截可能触发异常的原因。

        3
  •  1
  •   Kirill    14 年前

    您的侦听器(抛出异常的侦听器)不是唯一侦听特定事件的侦听器。核心Swing类(尤其是UI委托)注册自己的侦听器,以便能够正确地更新UI。如果您的侦听器失败,则不能保证所有(或任何)其他侦听器都会收到此特定事件的通知。

        4
  •  0
  •   Avrom    14 年前

    有两点:

    到底是什么原因 LocalFileSystem

    如果在某些情况下预期它将返回null,那么对它使用局部变量,并在调用任何方法之前检查它是否为null。

    exists File . 还有一个 isDirectory