为什么在JList中添加元素会使它在这种特殊情况下为空?

时间:2014-12-03 07:10:36

标签: java multithreading swing jscrollpane jlist

正如标题所说,当我尝试动态添加元素到JList内的JScrollPane时,它变为空。我认为它与多线程有关。

GUI是我正在处理的服务器的简单监视接口。我将发布我认为对此负责的部分代码:

但首先,这是框架:

public class EventMonitor extends JFrame{

private JList eventList;
private DefaultListModel<String> dlm ;
JScrollPane jPane;

public EventMonitor()
{
    super("Server Monitor");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new FlowLayout());

    dlm = new DefaultListModel<String> ();

    eventList = new JList();
    jPane = new JScrollPane(eventList);
    jPane.setPreferredSize(new Dimension(950, 600));
    add(jPane);

}

public void addEvent(String event)
 {
    dlm.addElement(event);
    eventList.setModel(dlm);
    jPane.revalidate();
    jPane.repaint();

 }
}

来自main()班级的Server

     //some code
    eventMonitor = new EventMonitor();
    eventMonitor.setBounds(250, 250, 1000, 650);
    eventMonitor.setVisible(true);
     //some other code
    eventMonitor.addEvent("Server is waiting for new connections..."); // this is shown in the list
    while(true)
        {
            ClientHandler clientHandler = new ClientHandler(listener.accept());// listener is ServerSocket
            clientList.add(clientHandler);
            clientHandler.start();
        }

这使得列表变为空:在ClientHandler构造函数中:

public ClientHandler(Socket socket){
//some code
Server.addEvent("The client is: " + user.GetName() + ", with the ip:" + user.GetIPv4() + ", and using the port: "  + user.GetPORT());
//some more code 
} // where Server.addEvent(String event) just calls eventMonitor.addEvent(event)

在此之后,'run&#39;从'ClientHandler'收听消息,它们通过Server.addEvent()发布,并且它没有问题,但是当另一个客户端连接时,它再次变为空。在ClientHandler构造函数中显示的第一个事件使列表完整(显示使其为空的事件)

1 个答案:

答案 0 :(得分:2)

看起来你正在阻止循环中的UI线程 - 当你调用accept()时,它会等待新的连接,这意味着UI线程可以&#39;重新绘制UI。你应该在一个单独的线程中做到这一点。

所有 UI 交互应该在UI线程中执行,例如,使用SwingUtilities.invokeLater