0

我想问一些关于线程使用的问题。我查看了很多帖子和这些帖子中建议的链接,但仍然空白。我有一个有几个类的 NetBeans 项目。其中之一是我用来单击按钮并执行一些处理的 Gui 类。从 Gui 我调用另一个类的实例,该类又调用其他类。其中一个类将 Sparql 查询提交到 TDB 后端数据库。现在所有输出都保存到文件中。

我想做的是以某种方式使从 Gui 调用的类在另一个线程上运行,并且还能够从一个或多个调用的类更新 Gui 上的 EditorPane 和 TextArea。到目前为止,我已经尝试调用 Gui 类的实例并在其中使用公共方法,但这不起作用。我正在调用实例 Gui

Gui gui = new Gui();
gui.setEditorPaneText("File name is: " + fn);

Gui 类中的方法是

public void setEditorPaneText(final String string) {
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            setString(string);
            EditorPane.setText(getString());
            EditorPane.repaint();
        }
    });
}

我尝试运行调试器,但处理从方法的第一行跳到最后一个大括号,而不处理其中的代码。我的 Gui 类有以下作为主要方法。评论部分是我在阅读有关该问题的大量帖子时更改的事件队列的先前版本。

public static void main(String args[]) {
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            new Gui().setVisible(true);
            throw new UnsupportedOperationException("Not supported yet.");
        }
    });
}

以下是我在阅读了有关此问题的一些帖子后替换的 main 方法的先前代码。

java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new Gui().setVisible(true);
        }
    });

任何有用的信息将不胜感激。谢谢你。

4

1 回答 1

0

我认为您的主要错误是您创建了 Gui 类的两个实例。您有两次以下代码段:new Gui(). 看看我下面的示例代码,看看如何将 Gui 传递给您的工作线程的示例。

// This is handwritte-untested-uncompiled code to show you what I mean
public class Main {
  public static void main(String[]args) {
     SwingUtilities.invokeLater(new Runnable() {
        public void run() {
           Gui g = new Gui();
           g.show(); // show() is equal to setVisible(true)
           g.doBackendAction(); // Normally this would be invoked by a button or sthg. I was to lazy
        }
     });
  }
}


public class Gui extends JFrame {
  private JTextArea area;
  public Gui() {
    // Just some code to create the UI. Not sure if this actually does sthg right :P
    area = new JTextArea();
    setContentPane(area);
    pack();
  }


  public void setTextAreaContent(final String string) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            area.setText(string);
            this.repaint(); // Not 100% sure if we need this

        }
    });
  }

  public void doBackgroundWork() {
    BackgroundWorker w = new BackgroundWorker(this);
    new Thread(w).start(); // Start a worker thread
  }
}

public class BackgroundWorker implements Runnable {
   private Gui gui;
   public BackgroundWorker(Gui gui) {
     this.gui = gui; // we take the initial instance of Gui here as a parameter and store it for later
   }

   public void run() {
     try { Thread.sleep(10 * 1000); } catch (InterruptedException e) {; }
     this.gui.setTextAreaContent("Hello World!"); // calls back to the Gui to set the content 

   }
}
于 2011-08-06T08:41:13.307 回答