java - 如何从另一个线程更新 JList?

标签 java multithreading swing jlist event-dispatch-thread

public class ListExample {
    public static void main(String[] args) {
       final List l=new List();
        l.init();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                l.list.updateUI();
                System.out.println("Asim");
            }
        });
    }
}

public class List extends  JFrame{
    public DefaultListModel DLM=new DefaultListModel();
    public JList list=new JList(DLM);
    private JPanel jp=new JPanel();
    private JScrollPane sp=new JScrollPane(list);
    public void init(){
        jp.add(sp);
        super.add(jp);
        super.setVisible(true);
        super.setLayout(new FlowLayout());
        super.setSize(400,500);
        UL p=new UL();
        p.UL_1();
    }
    public void Update_list(String[] n){
         list.setListData(n);
        list.updateUI();
    }

}
public class UL extends  List{
    public void UL_1(){
       t.start();
    }
    Thread t=new Thread(new Runnable() {
        @Override
        public void run() {
            //To change body of implemented methods use File | Settings | File Templates.
            String[] n={"Asim", "saif","Khan"};
            List l=new List();
            l.list.setListData(n);
            list.updateUI();
        }
    });
}

最佳答案

Swing 是一个单线程框架,这意味着您只能在事件调度线程的上下文中修改 UI 元素。同样,任何长时间运行的任务或其他阻塞进程都会阻止 EDT 处理新事件。

虽然有多种方法可以实现此目的,但最简单的可能是使用 SwingWorker

例如...

看看Concurrency in Swing了解更多详情

关于java - 如何从另一个线程更新 JList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20943327/

相关文章:

java - 无法为单元测试创​​建属性实例

multithreading - 如何使用 AsyncCalls 调用无参数类过程?

Android:如果主线程在工作线程之前完成会发生什么

java - 如何将ArrayList的属性复制到具有不同属性名称的其他ArrayList的另一个属性中?

java - 短语匹配引擎

Java:提高同步函数的线程速度

java - GridBagLayout 控制 Swing 中的对齐方式

java - 在 JFrame 中的特定点绘制一条线

java - 在java中获取自定义JPanel的深拷贝

java - Java 类型转换解决方案的 PHP 等价物