我正在运行正在侦听特定端口的本地服务器。
在客户端应用程序中,我正在运行一个GUI,它将显示一个新闻列表(由我创建的带有标题和正文的对象)
我作为参数发送一个ArrayList并将其添加到我的JList(ListNewsTitle)
public class GUI {
private Socket socket;
private Client client;
private JFrame Frame;
private JTextField TextSearch;
private JButton BtnSearch;
private JTextArea TextNewsBody;
private JList<News> ListNewsTitle;
private ArrayList<News> ListNews = new ArrayList<News>();
public GUI(Client client) throws FileNotFoundException {
this.client = client;
buildGUI();
}
private void buildGUI() throws FileNotFoundException {
Frame = new JFrame();
TextSearch = new JTextField();
BtnSearch = new JButton("Search");
TextNewsBody = new JTextArea();
ListNewsTitle = new JList<News>();
setFrame();
setFields();
}
//This method is called in the Client class.
public void go(Socket socket, ArrayList<News> listNews) {
this.socket = socket;
this.ListNews = listNews;
new ButtonAction(this);
News[] news = new News[listNews.size()];
listNews.toArray(news);
System.out.println(news.length + " is the lenght of news");//displays the correct number.
ListNewsTitle = new JList<News>(news);
Frame.pack();
Frame.setVisible(true);
}
JList显示在GUI中,但由于某种原因,它显示为空。 由于JList使用方法toString(),我改变了它。
public News(String title, String body ) {
this.title = title;
this.body = body;
}
@Override
public String toString() {
return title;
}
提前致谢。
答案 0 :(得分:0)
当你这样做时:
ListNewsTitle = new JList<News>(news);
您完全使用新数据创建单独的对象,现有列表保持原样(并且不再被该变量引用。)使用ListNewsTitle.setListData(news);
,您需要修改现有的列表。
区别似乎很小,但非常重要。当您替换列表时,任何其他引用现有列表的对象都不会更新其列表(因为它们的列表是您刚刚创建的列表的单独对象。)当您设置现有列表的内容,然后任何引用该同一现有对象的对象都将看到其更新状态。
在这种情况下,引用现有对象的对象包括GUI组件 - 因此您需要修改现有列表,而不是创建新列表,以便显示更改。