Java jlist元素未动态显示

Java jlist元素未动态显示,java,swing,jlist,Java,Swing,Jlist,我正在编写客户端-服务器聊天应用程序。我在客户端GUI中创建了jlist,以便可以显示在线客户端。但是,当创建该客户机GUI的不同对象时,jlist不会显示所有客户机,即如果在一个对象中创建了一个客户机,则其他对象不会显示该客户机。 这是我的密码: DefaultListModel model = new DefaultListModel(); static List<String> Client = new ArrayList<String>();

我正在编写客户端-服务器聊天应用程序。我在客户端GUI中创建了jlist,以便可以显示在线客户端。但是,当创建该客户机GUI的不同对象时,jlist不会显示所有客户机,即如果在一个对象中创建了一个客户机,则其他对象不会显示该客户机。 这是我的密码:

    DefaultListModel model = new DefaultListModel();
    static List<String> Client = new ArrayList<String>();
    public GUI() {
        initComponents();

    }
    public GUI(String hostname,int port, String user_name) throws  Exception{
        initComponents();
        my_name = user_name;
        s = new Socket("localhost", 80);
        Client.add(user_name);
        for(int i=0;i<Client.size();i++){
            model.addElement(Client.get(i));
        }
    }
DefaultListModel=newDefaultListModel();
静态列表客户端=新建ArrayList();
公共图形用户界面(){
初始化组件();
}
公共GUI(字符串主机名、int端口、字符串用户名)引发异常{
初始化组件();
我的名字=用户名;
s=新套接字(“本地主机”,80);
Client.add(用户名);
对于(int i=0;i
  • 你有一个问题

  • Swing不是线程安全的

  • a) 来自
    插座的输出
    从未通知
    EDT

    b) 将新的
    项目添加到
    DefaultListModel
    从未通知
    EDT

    c) 简单的解决方法是将代码行
    model.addElement(Client.get(i))
    包装到
    invokeLater()

  • 这个问题可能是

编辑jlist的调用器?
,请参见

SwingUtilities.invokeLater(new Runnable(){
    public void run(){
        model.addElement(Client.get(i));
    }
}); 

您是否确定使用该模型作为
JList
的模型。代码中未显示该模型。其他猜测可能是线程问题,如的答案所示@mKorbel@Robin,是的。jList1.setModel(model);它在initilization中给出。为了更快地获得更好的帮助,发布一个。您是否从启动GUI、创建GUI、显示GUI、启动Socket(最好的选项将来自SwingWorker,publish()回复ListModel,否则GUI将被冻结,直到Socker的数据停止)、使用Socker的数据更新ListModel