正如标题所说,当我尝试动态添加元素到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
构造函数中显示的第一个事件使列表完整(显示使其为空的事件)
答案 0 :(得分:2)
看起来你正在阻止循环中的UI线程 - 当你调用accept()
时,它会等待新的连接,这意味着UI线程可以&#39;重新绘制UI。你应该在一个单独的线程中做到这一点。
所有 UI 交互应该在UI线程中执行,例如,使用SwingUtilities.invokeLater
。