首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JList DefaultListModel ListSelectionListener

JList DefaultListModel ListSelectionListener
EN

Stack Overflow用户
提问于 2011-09-05 10:43:50
回答 1查看 1.4K关注 0票数 1

我在JSplitPane中有2个DefaultListModels。JSplitPane的左侧有RssChannel标题。选择RssChannel标题后,RssItem标题将显示在JSplitPane的右侧。

初始选择RssChannel标题时,将显示正确的RssItem标题。但是,当我在RssChannel标题之间来回切换时,正确的RssItem标题无法触发。

我如何修复我的侦听器,使正确的RssItem标题总是从它们各自的RssChannel中触发?

感谢您的建议

代码语言:javascript
复制
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);
         }   
      });  
   }
}
EN

回答 1

Stack Overflow用户

发布于 2011-09-05 22:40:06

我不确定RssReader的实现,但是您的ChannelListListener一直在向您的项目列表中添加数据。您需要的是channelTitleList中所选项目的标题列表。使用JListgetSelectedIndex()获取所选索引。接下来,基于选定的提要构建itemTitleList的内容,例如,构建为一个字符串列表。下面是ChannelListListener的一个示例,让您开始使用:

代码语言:javascript
复制
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
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7303469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档