2011-09-06 26 views
1
How do I fix my RemoveAction class so I don't get the following runtime error 
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.ArrayList; 
import java.io.*; 


public class GuiDriver extends JFrame{ 
    JList channelTitleJList, itemTitleJList; 
    DefaultListModel cModel, iModel; 
    List<RssReader> feedList = new ArrayList<RssReader>(); 
    int nextFeed=0; 
    ListSelectionModel lsm; 


    public void addFeed(RssReader feed){ 
     feedList.add(feed); 
    } 


    public JToolBar createToolBar(){ 
     JToolBar bar = new JToolBar(); 
     Action newToolBarButton = new AddAction("New"); 
     Action deleteToolBarButton = new RemoveAction("Delete"); 
     Action clearToolBarButton = new ClearAction("Clear"); 

     bar.add(newToolBarButton); 
     bar.add(deleteToolBarButton); 
     bar.add(clearToolBarButton); 

     bar.setFloatable(false);  
     return bar; 
    } 


    public JSplitPane createJSplitPane(){ 
     JSplitPane hSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,createChannelJScrollPane(), createItemJScrollPane()); 
     hSplitPane.setDividerLocation(150); 
     return hSplitPane; 
    } 


    public JScrollPane createChannelJScrollPane(){    
     cModel = new DefaultListModel(); 
     channelTitleJList = new JList(cModel); 
     JScrollPane channelJScrollPane = new JScrollPane(channelTitleJList); 
     channelTitleJList.setVisibleRowCount(20); 
     lsm = channelTitleJList.getSelectionModel(); 
     lsm.addListSelectionListener(new ChannelListListener());  

     return channelJScrollPane;  
    } 


    public JScrollPane createItemJScrollPane(){ 
     iModel = new DefaultListModel(); 
     itemTitleJList = new JList(iModel); 
     JScrollPane itemJScrollPane = new JScrollPane(itemTitleJList); 
     //itemTitleJList.addListSelectionListener(new ItemListListener()); 

     return itemJScrollPane; 
    } 


    public class AddAction extends AbstractAction{ 
     public AddAction(String name){ 
     super(name); 
     } 

     public void actionPerformed(ActionEvent e){ 
     System.out.println(getValue(Action.NAME)+" selected."); 
     JOptionPane message = new JOptionPane(); 
     String firstInput = message.showInputDialog(null, "Enter URL"); 
     try{ 
      DumpStockPage.readXml(firstInput); 
      File f = new File("RSSFeed.xml"); 
      addFeed(new RssReader(f)); 

      cModel.addElement(feedList.get(nextFeed).rssChannel.getTitle()); 
      nextFeed++; 
      iModel.clear(); 
     } 
     catch (IOException ee){ 
      System.err.println(ee); 
     } 
     } 
    } 


    public class RemoveAction extends AbstractAction{ 
     public RemoveAction(String name){ 
     super(name); 
     } 

     public void actionPerformed(ActionEvent e){ 
     cModel.removeElement(channelTitleJList.getSelectedValue()); 
     iModel.clear(); 
     } 
    } 


    public class ClearAction extends AbstractAction{ 
     public ClearAction(String name){ 
     super(name); 
     } 

     public void actionPerformed(ActionEvent e){ 
     iModel.clear(); 
     } 
    } 


    private class ChannelListListener implements ListSelectionListener{ 
     public void valueChanged (ListSelectionEvent e) {   
     boolean adjust = e.getValueIsAdjusting(); 
     if (!adjust) { 
      iModel.clear(); 
      List<String> titles = new ArrayList<String>(); 
      int i = channelTitleJList.getSelectedIndex(); //the index of the selected item in the left list 

      for(RssItem feed: feedList.get(i).rssChannel.items) { 
       iModel.addElement(feed.getTitle()); //build a list of titles, to be shown in the right list 
      } 
     } 
     } 
    } 

/* 
    private class ItemListListener implements ListSelectionListener { 
    public void valueChanged (ListSelectionEvent e) { 
     boolean adjust = e.getValueIsAdjusting(); 
     if (!adjust) { 
      int i = e.getLastIndex(); 
      try{ 
       JFrame w = new JFrame(); 
       w.setTitle("Html Display"); 
       w.setSize(1000, 600); 
       w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       w.setVisible(true); 

       JEditorPane htmlPane = new JEditorPane(); 
       htmlPane.setPage(feedList.get(i).rssChannel.items.get(i).getLink()); 
       w.add(new JScrollPane(htmlPane)); 
      } 
      catch(Exception ee){ 
       ee.printStackTrace(); 
      } 
     } 
    } 
    } 
*/ 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      GuiDriver frame = new GuiDriver(); 

      frame.setTitle("RSS Reader"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(frame.createJSplitPane(), BorderLayout.NORTH); 
      frame.add(frame.createToolBar(), BorderLayout.SOUTH); 

      frame.setVisible(true); 
      frame.setSize(800,400); 
     } 
     }); 
    } 
} 

回答

2

附加检查,以您的ChannelListListener.valueChanged()

if (i==-1) return; 

之前的for循环,甚至更好:

if (channelTitleJList.isSelectionEmpty()) return; 
+0

谢谢!!!!!! – blitzeus