Java 在这种特殊情况下,为什么向JList添加元素会使其为空?
正如标题所述,当我尝试向Java 在这种特殊情况下,为什么向JList添加元素会使其为空?,java,multithreading,swing,jscrollpane,jlist,Java,Multithreading,Swing,Jscrollpane,Jlist,正如标题所述,当我尝试向JList动态添加元素时,该元素位于JScrollPane中,它将变为空。我认为这与多线程有关 GUI是我正在使用的服务器的简单监控界面。我将发布我认为应该对此负责的部分代码: 但首先,这是框架: public class EventMonitor extends JFrame{ private JList eventList; private DefaultListModel<String> dlm ; JScrollPane jPane; public
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();
}
}
这就是使列表变空的原因:在ClientHandler
constructor中:
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)
在此之后,
'ClientHandler'
中的'run
'侦听消息,并通过Server.addEvent()
发布消息,它可以正常工作,但当另一个客户端连接时,它会再次变空。在ClientHandler
构造函数中的事件之后显示的第一个事件使列表完整(显示使其也为空的事件)看起来您正在阻止循环中的UI线程-当您调用accept()
时,将等待新连接,这意味着UI线程无法重新绘制UI。您应该在单独的线程中执行此操作
所有UI交互都应该在UI线程中执行,例如使用。1-Swing不是线程安全的,调用
dlm.addElement(事件)代码>应该在事件调度线程的上下文中完成,包装在SwingUtilities中。invokeLater
应该有帮助。2-不需要eventList.setModel(dlm)代码>,jPane.revalidate()代码>,jPane.repaint()
在addEvent
方法中,为了进一步阅读,我建议:@keuleJ我会读的。谢谢。我会试试看,然后我会发布更新。谢谢你的回答。@laurGanta:我们看到了一个相关的例子。
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)