gpt4 book ai didi

java - JList DefaultListModel ListSelectionListener

转载 作者:太空宇宙 更新时间:2023-11-04 08:32:05 26 4
gpt4 key购买 nike

我在 JSplitPane 中有 2 个 DefaultListModel。 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 中所选项目的标题列表。使用JListgetSelectedIndex() 获取选定的索引。接下来,根据所选提要构建 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
}
}

关于java - JList DefaultListModel ListSelectionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7303469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com