JList не отображает Object [] в GUI - PullRequest
0 голосов
/ 26 апреля 2018

Я использую локальный сервер, который прослушивает определенный порт.

В приложении на стороне клиента я использую графический интерфейс, который будет отображать список новостей (созданный мной объект с заголовком и телом)

Я отправляю в качестве параметра 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 отображается в графическом интерфейсе, но по какой-то причине он отображается пустым. Поскольку JList использует метод toString (), я также изменил его.

public News(String title, String body ) {
    this.title = title;
    this.body = body;
}

@Override
public String toString() {
    return title;
}

Заранее спасибо.

1 Ответ

0 голосов
/ 26 апреля 2018

Когда вы делаете:

ListNewsTitle = new JList<News>(news);

Вы создаете отдельный объект полностью с новыми данными, существующий список остается неизменным (и больше не ссылается на эту переменную). С ListNewsTitle.setListData(news); вы модифицируете существующий список.

Различие кажется незначительным, но очень важно. Когда вы заменяете список, любые другие объекты, которые имели ссылку на существующий список, не будут обновлять свой список (так как их список является отдельным объектом от того, который вы только что создали.) Когда вы устанавливаете содержимое существующий список, то любые объекты, имеющие ссылку на этот же существующий объект, будут видеть его обновленное состояние.

В этом случае объекты, имеющие ссылку на существующий объект, включают в себя компоненты графического интерфейса пользователя, поэтому для отображения изменений необходимо изменить существующий список, а не создавать новый.

...