Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在这种特殊情况下,为什么向JList添加元素会使其为空?_Java_Multithreading_Swing_Jscrollpane_Jlist - Fatal编程技术网

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)