有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在事件调度线程上运行类的所有方法

我创建了一个Swing组件,它有几种方法。我希望这个类的所有方法都在Swing事件调度线程(EDT)上运行,而调用程序在工作线程上运行。目前我脑海中唯一的解决方案是:

对于此类中的每个方法:

public void a(params)

我应该将其重命名为:

private void aOnEDT(params)

并添加另一种方法:

public void a(params) {
    SwingUtilities.invokeAndWait(new Runnable(){
        public void run() {
            aOnEDT(params);
        }
    });
}

但这不是很恶心吗?我该怎么做


共 (2) 个答案

  1. # 1 楼答案

    您可以测试当前是否正在EDT上进行调用,如果不是,则将Runnable放入SwingUtilites.invokeLater()

    public void myMethod() {
           if (SwingUtilities.isEventDispatchThread()) {
                //... your code
           } else {
               SwingUtilities.invokeLater(
                      new Runnable(){
                         public void run() {
                               myMethod();
                         }
                      });
           {
      }                   
    

    如果您在EDT上,这将保持方法运行,而不会将其置于事件队列的末尾

  2. # 2 楼答案

    使用SwingWorker并在done()方法中更新GUI组件。用donInBackground()方法做背景工作