Javafx 2 以对话框的形式运行第二阶段

Javafx 2 以对话框的形式运行第二阶段,javafx-2,scenebuilder,Javafx 2,Scenebuilder,我的项目有一个带有一些按钮的主GUI(Stage):通过右键单击按钮,我想在另一个包中运行另一个Stage 这是项目树 newprojectx是带有主GUI和 togglebuttonDraw.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent mouseEvent) { if (mouseEvent.isSeco

我的项目有一个带有一些按钮的主GUI(Stage):通过右键单击按钮,我想在另一个包中运行另一个Stage

这是项目树

newprojectx是带有主GUI和

togglebuttonDraw.setOnMousePressed(new EventHandler<MouseEvent>() {
      @Override
      public void handle(MouseEvent mouseEvent) {
        if (mouseEvent.isSecondaryButtonDown()){



        }
      }
    });
togglebuttonDraw.setOnMousePressed(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent MouseEvent){
if(mouseEvent.isSecondaryButtonDown()){
}
}
});
是鼠标右键单击的方法:我想从这个按钮运行fibonaccipriceretraction包中的.fxml

togglebuttonDraw在NewProjectXController类中

非常感谢您的帮助

编辑:这是我希望通过右键单击运行的.fxml

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/fibonaccipriceretracement/FibonacciPriceRetracementDialog.fxml"));
Parent content = (Parent) loader.load();
Stage stage = new Stage();
stage.setScene(new Scene(content));
stage.show();

对于小型FXML,Sebastian的解决方案是好的,但是如果您在打开弹出窗口时遇到冻结,可能是FXML太大或者您正在通过网络加载它。在这种情况下,FXMLLoader将阻止您的GUI,因此您需要在后台执行FXMLLoader。可以使用返回场景父级的服务,并在服务完成后在舞台上创建场景

以下是一个完整的示例:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
    VBox vbox = new VBox(10);
    vbox.setAlignment(Pos.CENTER);

    final ProgressIndicator progress = new ProgressIndicator(-1);
    progress.setVisible(false);

    Button button = new Button("Open fxml");
    button.setOnAction(new EventHandler<ActionEvent>() {            
        @Override
        public void handle(ActionEvent event) {
            final Service<Parent> service = new Service<Parent>() {                 
                @Override
                protected Task<Parent> createTask() {   
                    return new Task<Parent>() {                         
                        @Override
                        protected Parent call() throws Exception {
                            //Out of FX Thread
                            String fxml = "/FxmlTest.fxml";
                            Parent root = FXMLLoader.load(getClass().getResource(fxml));
                            return root;
                        }
                    };
                }
            };
            progress.visibleProperty().bind(service.runningProperty());
            service.start();
            service.runningProperty().addListener(new ChangeListener<Boolean>() {
                @Override
                public void changed(ObservableValue<? extends Boolean> value, Boolean oldValue, Boolean newValue) {                 
                    if(!newValue){//The service has ended
                        //In the FX Thread
                        Stage stage = new Stage();
                        Scene scene = new Scene(service.getValue());
                        stage.setScene(scene);
                        stage.show();
                    }
                }
            });
        }
    });

    vbox.getChildren().addAll(button, progress);

    Scene scene = new Scene(vbox);
    stage.setScene(scene);
    stage.show();
}

public static void main(String[] args) {
    launch(args);
}
}
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.concurrent.Service;
导入javafx.concurrent.Task;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.fxml.fxmloader;
导入javafx.geometry.Pos;
导入javafx.scene.Parent;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.ProgressIndicator;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类主扩展应用程序{
@凌驾
public void start(Stage)引发异常{
VBox VBox=新的VBox(10);
vbox.setAlignment(位置中心);
最终进度指标进度=新进度指标(-1);
进度。setVisible(false);
按钮按钮=新按钮(“打开fxml”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
最终服务=新服务(){
@凌驾
受保护的任务createTask(){
返回新任务(){
@凌驾
受保护的父调用()引发异常{
//脱线
字符串fxml=“/FxmlTest.fxml”;
父根=FXMLLoader.load(getClass().getResource(fxml));
返回根;
}
};
}
};
progress.visibleProperty().bind(service.runningProperty());
service.start();
service.runningProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observevaluehi Sebastian,谢谢:我得到这个异常java.lang.IllegalStateException:位置未设置。在javafx.fxml.fxmloader.load(fxmloader.java:2021)在newprojectx.NewProjectXController$1.handle(NewProjectXController.java:363)在newprojectx.NewProjectXController$1.handle(NewProjectXController.java:355)在com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)上,为什么要创建一个窗格?我不应该创建一个带有场景的舞台,然后调用Stage.show()?嗨,alberto,我在我的示例中犯了一个拼写错误,因为我必须实际键入它。它现在应该可以工作了。我制作了一个窗格,因为我不知道您的fxml是什么样子。如果您想要一个包含fxml内容的新阶段,请再次查看答案。我正在尝试运行您的示例,但在final Service=new Service()中出现错误,它说类型服务不带参数。你使用javafx.concurrent.Service吗?我刚刚用我正在使用的导入编辑了答案。我建议你看看Concurrency javafx 2教程。一般来说,我不同意这个解决方案,从本地资源加载fxml通常会非常快-只有当你通过网络发送广告,性能会很慢,足以保证使用任务或服务。我想如果FXML很小,就没有问题。但有时我会遇到一些冻结加载FXML,其中包含很多组件。当你按下按钮时,什么都不会发生,在加载弹出窗口时,你什么也看不到,实际上是GU我认为这是一个很好的解决方案。我还修改了我的答案,但你提出的例外情况除外。谢谢,干杯。