与Android一样,JavaFX也不允许在UI线程之外对高级界面进行更新,比如网络线程返回了数据,想要在界面上刷新出来,如果在网络线程里直接处理就可能抛出异常。Android可以通过Handler发送Message实现像通知UI线程,保证线程安全,JavaFX也有类似的方法。
1).javafx.concerrent.Worker接口,主要提供了Task和Service两个类,用来建立能与UI线程安全通信的线程。Task和Service区别不大,Service提供了一些重置、重启之类的方法,可以理解成Task是执行一次性的任务,Service提供服务。示例:
Task<Void> updateNotificationTask = new Task<Void>() { @Override protected Void call() throws Exception { notificationTextField.setText("hello"); return null; } }; new Thread(updateNotificationTask).start(); |
2).Platform.runLater,推荐方法,简单、有效。该方法会在JavaFX程序线程中某个时刻安全地执行指定的线程。之前试过用Task无法在其它线程中建立Stage,而这个方法可以。示例:
Platform.runLater(new Runnable() {
@Override public void run() { final Stage stage = new Stage(); Group rootGroup = new Group(); Scene scene = new Scene(rootGroup, 200, 200, Color.WHITESMOKE); stage.setScene(scene); stage.centerOnScreen(); stage.show(); Text text = new Text(20, 110, "hello"); rootGroup.getChildren().add(text); } }); |
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。