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