作为JavaFx的工具类
//内部线程也是UI线程,作用是,线程空闲时候,更新UI,但是仍不可做频繁大量的UI更新
Platform.runLater(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
//即使关闭最后一个窗口,程序也会保持运行
Platform.setImplicitExit(false);
//退出程序
Platform.exit();
//检测电脑是否支持一些特性
Platform.isSupported(ConditionalFeature.MEDIA);
使用Platform.runLater()
方法,虽然可以实现更新UI,但是也仅限于简单的更新,如果出现大量频繁的更新,会造成UI卡死
Task类可以实现对复杂任务进度的监听,并且配合监听器可以实现实时更新UI
public class MyTask extends Task<Integer> {
// 通知更新进度
@Override
protected void updateProgress(long workDone, long max) {
super.updateProgress(workDone, max);
}
// 通知更新进度
@Override
protected void updateProgress(double workDone, double max) {
super.updateProgress(workDone, max);
}
// 通知更新消息
@Override
protected void updateMessage(String message) {
super.updateMessage(message);
}
// 通知更新标题
@Override
protected void updateTitle(String title) {
super.updateTitle(title);
}
// 参数value即为call方法的返回值,当call方法执行完成后调用
@Override
protected void updateValue(Integer value) {
super.updateValue(value);
}
// 以上方法在call方法中需要主动调用(updateValue除外)
// 调用后,即可配合Task实现类实例的相关监听器进行监听
@Override
protected Integer call() throws Exception {
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
updateTitle("第" + i + "次更新");
updateMessage("第" + i + "次更新");
updateProgress(i,9);
}
return 1;
}
}
使用监听器
MyTask myTask = new MyTask();
// 绑定Title监听
myTask.titleProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
// 对UI的修改操作
}
});
// 绑定Message监听
myTask.messageProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
// 对UI的修改操作
}
});
// 绑定Value(即call方法返回值)监听
myTask.valueProperty().addListener(new ChangeListener<Integer>() {
@Override
public void changed(ObservableValue<? extends Integer> observable, Integer oldValue, Integer newValue) {
// 对UI的修改操作
}
});
// 对Progress(进度)的监听
myTask.progressProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
// 对UI的修改操作
}
});
// 启动任务
new Thread(myTask).start();