gpt4 book ai didi

java - 为什么在这种特殊情况下向 JList 添加元素会使其为空?

转载 作者:行者123 更新时间:2023-11-30 03:38:39 26 4
gpt4 key购买 nike

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

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();

}
}

Server 类的 main() 中:

     //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)

此后,来自 'ClientHandler''run' 监听消息,并通过 Server.addEvent() 发布消息,并且它工作没有问题,但是当另一个客户端连接时,它又变空了。 ClientHandler 构造函数中的事件之后显示的第一个事件使列表完整(显示也使其为空的事件)

最佳答案

看起来您在循环中阻塞了 UI 线程 - 当您调用 accept() 时,它将等待新连接,这意味着 UI 线程无法重新绘制用户界面。您应该在单独的线程中执行此操作。

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

关于java - 为什么在这种特殊情况下向 JList 添加元素会使其为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27265709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com