SwingWorker看起来似乎很简单.
基本上,您需要对要实现的目标做出一些基本决策.
>您是否想在进程运行时定期返回更新?
>您要返回过程的结果…还是同时返回?
>您要提供进度更新吗?
根据您要执行的操作,将更改声明SwingWorker的方式.
例如…
public class HardWorker extends SwingWorker {
如果要执行定期更新,则ReturnValueType是工作程序将生成的最终结果,而PeriodicalType是可以发送回UI线程的对象的类型(可以指定自己的值).
您可以为这些值中的任何一个指定Void或Object,如果您不在乎
当执行时,SwingWorker将调用doInBackground,该方法将在其自己的线程中调用,从而允许在事件调度线程之外执行长时间运行的任务.
如果要在doInBackground方法完成之前将值发送回UI,则可以调用publish(instanceOfPeriodicalType).最终,传递给该方法的值将传递给process方法.
由于可以将多个项目发送到publish方法,因此process方法提供了List< PeriodicalType>.论点.调用时,此方法将在EDT的上下文中执行,从而使您可以更新UI.
一旦doInBackground完成,它将返回类型为ReturnValueType的返回值(如果您不关心,则返回null).
如果对此结果感兴趣,则应使用SwingWorker#get,但应注意,该方法将在doInBackground返回之前阻塞,这意味着您不应该在EDT中调用此方法,除非您知道doInBackground方法已返回.您可以使用isDone或isCancelled方法检查工作程序的状态,或者…
您可以使用PropertyChangeListener并监视state属性或重写SwingWorker的done方法.
如果要提供进度更新,则可以在doInBackground方法中调用setProgress来更新工作程序的进度.这将触发一个名为progress的PropertyChangeEvent,您可以通过使用PropertyChangeListener进行监视.将在EDT的上下文中调用此侦听器.
看一眼:
更多细节.
通常,要使用SwingWorker,您要做的是将设计分为两组. EDT中可以在后台完成的所有操作以及需要完成的所有操作.
您可以开始构建员工的基本概念.
基本示例…
这有很多假设.基本上,它假定已经设置了UI,并且它将用于挑选新结果并将其传递回特定系列.
基本上,根据需要,将对工人进行骚扰,并将其传递给它.
GraphWorker worker = new GraphWorker(series);
worker.execute();
然后,工作将执行查询并将结果传递回处理方法
public class GraphWorker extends SwingWorker {
private TimeSeries series;
private Second sec;
public GraphWorker(TimeSeries series) {
this.series = series;
sec = new Second();
}
@Override
protected Void doInBackground() throws Exception {
ResultSet rs;
Connection conn = null;
try {
conn = (Connection) getMySqlConnection();
Statement st = conn.createStatement();
rs = st.executeQuery("SHOW GLOBAL STATUS");
while (rs.next()) {
publish(new String[]{rs.getString(1), rs.getString(2)});
}
} finally {
conn.close();
}
return null;
}
@Override
protected void process(List chunks) {
for (String[] value : chunks) {
try {
int iValue = Integer.parseInt(value[1]);
series.add(sec, Value);
} catch (NumberFormatException exp) {
exp.printStackTrace();
}
}
}
}