2011-09-05 7 views
1

JSplitPane内に2つのDefaultListModelsがあります。 JSplitPane の左側にはRssChannelタイトルがあります。 RssChannelタイトルを選択すると、RssItemのタイトル がJSplitPaneの右側に表示されます。JList DefaultListModel ListSelectionListener

最初の時間RssChannelタイトルが選択されていると、正しいRssItemタイトルが表示されます。 しかし、私がRssChannelのタイトル間を行き来するとき、正しいRssItemタイトル は発砲しません。

リスナーを修正して、正しいRssItemタイトルがそれぞれのRssChannelから常に発せられるようにするにはどうすればよいですか?任意の提案

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

早いほど良いのヘルプについては、[SSCCE](http://pscode.org/sscce.html)を投稿してください。提案については、あなたは質問をすることをお勧めします。 ;) –

答えて

1

ため

おかげで私はRssReaderの実装についてはよく分からないが、あなたのChannelListListenerは、あなたのアイテムリストにデータを追加し続けます。あなたが望むのは、選択したアイテムのタイトルのリストです。channelTitleListです。 getSelectedIndex()JListを使用して、選択したインデックスを取得します。次に、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 
    } 
} 
+0

RssChannelを追加してクリックすると、正しいRssItemタイトルが表示されます。しかし、複数のRssChannelsを追加して、リストの一番下からクリックすると、最初の選択肢だけが正しく表示されます。次の選択には、以前にクリックされたアイテムのRssChannelタイトルが表示されます。 – blitzeus

+0

あなたが望むようにアイテムのコンテンツを構築していないようです。私は選択されたフィードのタイトルのリストを取得する方法で私の答えを変更しました。 – tb189

+2

うまくいけば答えを受け入れることができるので、問題は解決済みとマークされます。 – tb189

関連する問題