簡體   English   中英

JList DefaultListModel ListSelectionListener

[英]JList DefaultListModel ListSelectionListener

我在JSplitPane中有2個DefaultListModels。 JSplitPane的左側具有RssChannel標題。 當選擇了RssChannel標題時,RssItem標題應該顯示在JSplitPane的右側。

選擇初始時間RssChannel標題后,將顯示正確的RssItem標題。 但是,當我在RssChannel標題之間來回切換時,不會觸發正確的RssItem標題。

如何修復我的偵聽器,以便始終從各自的RssChannel觸發正確的RssItem標題?

感謝您的任何建議

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM