[英]Why adding element to JList makes it empty in this particular case?
如標題所示,當我嘗試向JScrollPane
內部的JList
動態添加元素時,該元素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交互都應在UI線程中執行,例如,使用SwingUtilities.invokeLater
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.