2012-01-05 34 views
0

我有一段代码根据文件内容设置ListModel并将其添加到jList。当我第一次选择文件时,代码正确运行。当我选择第二个文件时,它会给出数组越界异常。 runList.setModel(model);发生错误;将ListModel设置为JList

下面是代码

 protected class OpenFileListener implements ActionListener 
{ 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     try 
     { 
     JFileChooser fileChooser = new JFileChooser(); 
     fileChooser.setFileFilter(new FileNameExtensionFilter("*.txt", "txt")); 
     fileChooser.setCurrentDirectory(new File(".")); 
     int result = fileChooser.showOpenDialog(null); 
     fileName = fileChooser.getSelectedFile().getPath(); 
     molfindOutText.setText(getFileName()); 
     DefaultListModel model = new DefaultListModel(); 
     runList.setModel(model); 
     File f = new File(getFileName()); 
     Scanner scanner = new Scanner(f); 
     lineNo = 0 ; 
     int i = 0; 
     idLines = new ArrayList(); 
     while (scanner.hasNextLine()) 
     { 
      String line = scanner.nextLine(); 
      lineNo = lineNo+1; 
      if (line.matches(".*COMPOUND_IDENTIFICATION_RUN.*")) 
      { 
      model.add(i, line); 
      runList.setSelectedIndex(0); 
      idLines.add(lineNo); 
      i++; 
      } 
     } 
     currentRun = 1; 
     if (idLines.size()>1) 
     { 
     extractRunInfo(idLines.get(0),idLines.get(1)-2); 
     } 
     else 
     { 
     extractRunInfo(idLines.get(0),lineNo); 
     } 
     scanner.close(); 
     runList.addListSelectionListener(lsl); 
     } 
     catch(Exception e) 
     { 
    System.out.println(e.toString()); 
    } 

    } 

的printStackTrace

java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.get(ArrayList.java:324) 
    at edu.uconn.pharmacy.molfind.AnalysisPanel$1.valueChanged(AnalysisPanel.java:99) 
    at javax.swing.JList.fireSelectionValueChanged(JList.java:1795) 
    at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1809) 
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167) 
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:147) 
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:194) 
    at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:388) 
    at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:398) 
    at javax.swing.DefaultListSelectionModel.removeSelectionIntervalImpl(DefaultListSelectionModel.java:559) 
    at javax.swing.DefaultListSelectionModel.clearSelection(DefaultListSelectionModel.java:403) 
    at javax.swing.JList.clearSelection(JList.java:2043) 
    at javax.swing.JList.setModel(JList.java:1676) 
    at edu.uconn.pharmacy.molfind.AnalysisPanel$OpenFileListener.actionPerformed(AnalysisPanel.java:131) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
    at java.awt.Component.processMouseEvent(Component.java:6373) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
    at java.awt.Component.processEvent(Component.java:6138) 
    at java.awt.Container.processEvent(Container.java:2085) 
    at java.awt.Component.dispatchEventImpl(Component.java:4735) 
    at java.awt.Container.dispatchEventImpl(Container.java:2143) 
    at java.awt.Component.dispatchEvent(Component.java:4565) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4621) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212) 
    at java.awt.Container.dispatchEventImpl(Container.java:2129) 
    at java.awt.Window.dispatchEventImpl(Window.java:2478) 
    at java.awt.Component.dispatchEvent(Component.java:4565) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679) 
    at java.awt.EventQueue.access$000(EventQueue.java:85) 
    at java.awt.EventQueue$1.run(EventQueue.java:638) 
    at java.awt.EventQueue$1.run(EventQueue.java:636) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
    at java.awt.EventQueue$2.run(EventQueue.java:652) 
    at java.awt.EventQueue$2.run(EventQueue.java:650) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:649) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+0

请发布堆栈跟踪。 – 2012-01-05 20:39:13

+0

这里是printStackTrace – lochi 2012-01-05 21:07:58

回答

1

这样看来,错误是在你已经注册名单上的一个选择监听器,它试图访问的元素(现在为空)列表。在堆栈跟踪的第二个条目告诉你在哪里看:

at edu.uconn.pharmacy.molfind.AnalysisPanel$1.valueChanged(AnalysisPanel.java:99) 

也许你只需要的valueChanged()来检查,如果该列表是空的,什么也不做在这种情况下。

+0

删除ListSelectionListner修复了这个问题。感谢您指引我走向正确的方向。 runList.removeListSelectionListener(LSL); runList.setModel(model); – lochi 2012-01-05 21:35:55