java swingworker_java-如何使用SwingWorker?

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:32   3346   0

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();

}

}

}

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP