JList不在GUI

时间:2018-04-26 15:05:22

标签: java jlist

我正在运行正在侦听特定端口的本地服务器。

在客户端应用程序中,我正在运行一个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;
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

当你这样做时:

ListNewsTitle = new JList<News>(news);

您完全使用新数据创建单独的对象,现有列表保持原样(并且不再被该变量引用。)使用ListNewsTitle.setListData(news);,您需要修改现有的列表。

区别似乎很小,但非常重要。当您替换列表时,任何其他引用现有列表的对象都不会更新其列表(因为它们的列表是您刚刚创建的列表的单独对象。)当您设置现有列表的内容,然后任何引用该同一现有对象的对象都将看到其更新状态。

在这种情况下,引用现有对象的对象包括GUI组件 - 因此您需要修改现有列表,而不是创建新列表,以便显示更改。