簡體   English   中英

為什么在這種特殊情況下向JList添加元素使其為空?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM