我想问一些关于线程使用的问题。我看了很多帖子和链接,但仍然是空白的。我有一个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.");
}
});
}
以下是我在阅读了关于这个问题的一些帖子后替换的主要方法的前一个代码。
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Gui().setVisible(true);
}
});
任何有用的信息都将不胜感激。非常感谢。
我认为您的主要错误是创建了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
}
}