JList DefaultListModel ListSelectionListener



我在JSplitPane中有2个DefaultListModels。JSplitPane的左侧拥有RssChannel的头衔。当选择RssChannel标题时,RssChannel标题应该显示在JSplitPane的右侧。

第一次选择RssChannel标题时,正确的RssItem标题就会出现。但是当我在rschannel标题之间来回切换时,正确的RssItem标题不火。

我怎么能修复我的监听器,使正确的RssItem标题总是从各自的rschannel发射?

谢谢你的建议

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 channelTitleList, itemTitleList;
    DefaultListModel cModel, iModel;
    List<RssReader> feedList = new ArrayList<RssReader>();
    int nextFeed=0;
    public GuiDriver(){
    }
    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 JSpli tPane(JSplitPane.HORIZONTAL_SPLIT,createChannelJScrollPane(), createItemJScrollPane());
       hSplitPane.setDividerLocation(500);
       return hSplitPane;
   }

   public JScrollPane createChannelJScrollPane(){            
      cModel = new DefaultListModel(); 
      channelTitleList = new JList(cModel);
      JScrollPane channelJScrollPane = new JScrollPane(channelTitleList);
      channelTitleList.setVisibleRowCount(20);
      channelTitleList.getSelectionModel.addListSelectionListener(new ChannelListListener());      
      return channelJScrollPane;     
   }

   public JScrollPane createItemJScrollPane(){
      iModel = new DefaultListModel();
      itemTitleList = new JList(iModel);
      JScrollPane itemJScrollPane = new JScrollPane(itemTitleList);
      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(channelTitleList.getSelectedValue());
         feedList.remove(e);
         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) {
            int i = e.getLastIndex();
            for (int j=0; j<feedList.get(i).rssChannel.getItems().size(); j++)
               iModel.addElement(feedList.get(i).rssChannel.items.get(j).getTitle());
         }
      }
   }

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

我不确定RssReader的实现,但是您的ChannelListListener不断向您的项目列表添加数据。您需要的是channelTitleList中所选项目的标题列表。用JList中的getSelectedIndex()得到所选的指标。接下来,基于所选提要构建itemTitleList的内容,例如作为字符串列表。下面是ChannelListListener的一个示例:

public void valueChanged (ListSelectionEvent e) {        
     boolean adjust = e.getValueIsAdjusting();
     if (!adjust) {
        List<String> titles = new ArrayList<String>();
        int i = channelTitleList.getSelectedIndex(); //the index of the selected item in the left list
        //Change RssFeed to the appropriate class for these 'items'
        for(RssFeed feed: feedList.get(i).rssChannel.items) {
            titles.add(feed.getTitle());  //build a list of titles, to be shown in the right list
        }
        itemTitleList.setListData(titles.toArray()); //change the content of the right list
    }
}

相关内容

  • 没有找到相关文章

最新更新