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