我正在尝试从任务(线程)关闭JavaFX中的舞台。
为了实现这一点,我尝试将对Stage的引用传递给扩展Task的类,在那里设置当前的Stage。
然后在call()结束时关闭舞台。但 .close()和.hide()根本没有隐藏/关闭舞台。
类:SampleStage
public class SampleStage extends Application {
@Override
public void start(final Stage primaryStage) throws Exception {
primaryStage.setTitle("JavaFx Dialog");
final Button btn = new Button();
btn.setText("Click me to display popup dialog");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
Stage dialog = new Stage();
Taskee task = new Taskee();
dialog.initStyle(StageStyle.UTILITY);
task.setStage(dialog);
new Thread(task).start();
Scene scene2 = new Scene(new Group(new Text(25, 25, "Hello World!")));
dialog.setScene(scene2);
dialog.show();
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Class Taskee:
import javafx.concurrent.Task; import javafx.stage.Stage;
public class Taskee extends Task<Void>{
private Stage stage;
@Override
protected Void call() throws Exception {
for(int i=0;i<10;i++){
//@DoSomething()
for(long l=0;l<10000;l++);
System.out.println("i=" + i);
}
getStage().close();
getStage().hide();
return null;
}
public Stage getStage() {
return stage;
}
public void setStage(Stage stage) {
this.stage = stage;
}
}
注意:getStage().getScene().getWindow().hide();
也不起作用。
答案 0 :(得分:2)
必须在FX Application线程上调用hide()
方法。 (在Java 8中,您的代码实际上会引发异常。)
使用Task
的{{1}}处理程序在这种情况下关闭舞台:
setOnSucceeded()