blitzeus
blitzeus

Reputation: 495

removing items from the JLIST

When the delete button is pressed a runtime error occurs, and the item doesn't delete until the the channelTitleJList (left side of the JScrollPane is pressed again).

Why doesn't the RemoveAction class delete the item instantly?

Also the itemTitleJList doesn't clear as expected.

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(500);
      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 implements ListSelectionListener{
      int i;
      public RemoveAction(String name){
         super(name);
      }

      public void valueChanged (ListSelectionEvent e) {
         i = channelTitleJList.getSelectedIndex();
         cModel.remove(i);
      }

      public void actionPerformed(ActionEvent e){
         cModel.removeElement(channelTitleJList.getSelectedValue());
         cModel.remove(i);
      } 
   }

   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) {
            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) {
                titles.add(feed.getTitle());  //build a list of titles, to be shown in the right list
            }

            itemTitleJList.setListData(titles.toArray()); //change the content of 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);
         }   
      });  
   }
}

Upvotes: 0

Views: 1887

Answers (1)

oliholz
oliholz

Reputation: 7507

RemoveAction get the selected Index on valueChanged() and delete the item from the Model.
On actionPerformed() the selected value is removed again and the selected Index is removed again. Why so often?
Btw: On actionPerformed() does not call channelTitleJList.getSelectedIndex() it removes the same index which was removed by valueChanged() but this index isn't there anymore, perhaps another element is removed. After that there is no selection in the JList.

Your ArrayIndexOutOfBoundsException: i is -1 because JList.getSelectedIndex() Returns -1 if there is no selection. see here

Upvotes: 1

Related Questions