gui JLIst运行时错误


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);
         }   
      });  
   }
}

为您的ChannelListListener.valueChanged()添加检查:

if (i==-1) return;

在for循环之前,或者更好:

if (channelTitleJList.isSelectionEmpty()) return;

最新更新