我来自.NET环境,即使对于初学者来说,事件侦听也很容易实现。但是这次我必须在Java中执行此操作。
我的伪代码:
主窗体-
public class MainForm extends JFrame {
...
CustomClass current = new CustomClass();
Thread t = new Thread(current);
t.start();
...
}
定制类-
public class CustomClass implements Runnable {
@Override
public void run()
{
//...be able to fire an event that access MainForm
}
}
我找到了这个例子,但在这里我必须监听一个像另一个例子中的事件。我应该把它们混在一起,我在Java方面的技能水平太低了。你能帮我制定一个最佳解决方案吗?
我认为你要找的是SwingWorker。
public class BackgroundThread extends SwingWorker<Integer, String> {
@Override
protected Integer doInBackground() throws Exception {
// background calculation, will run on background thread
// publish an update
publish("30% calculated so far");
// return the result of background task
return 9;
}
@Override
protected void process(List<String> chunks) { // runs on Event Dispatch Thread
// if updates are published often, you may get a few of them at once
// you usually want to display only the latest one:
System.out.println(chunks.get(chunks.size() - 1));
}
@Override
protected void done() { // runs on Event Dispatch Thread
try {
// always call get() in done()
System.out.println("Answer is: " + get());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
当然,在使用 Swing 时,您希望更新一些 GUI 组件,而不是打印出来。所有 GUI 更新都应在事件调度线程上完成。
如果只想执行某些更新,并且后台任务没有任何结果,则仍应在done()
方法中调用get()
。如果您不这样做,doInBackground()
中抛出的任何异常都将被吞噬 - 很难找出应用程序无法正常工作的原因。