Javafx:在setOnAction中更改场景

Javafx:在setOnAction中更改场景,javafx,stage,scene,Javafx,Stage,Scene,我正在构建一个包含多个场景的JavaFX应用程序。在setOnAction事件中更改场景时,变量的范围有问题。这是我的代码: Stage myStage; public Scene logInScene(){ ... all the buttons / textFields createAccountButton.setOnAction(new EventHandler<ActionEvent>(){ public void handle(Action

我正在构建一个包含多个场景的JavaFX应用程序。在setOnAction事件中更改场景时,变量的范围有问题。这是我的代码:

Stage myStage;

public Scene logInScene(){
   ... all the buttons / textFields

   createAccountButton.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent t){
              **this.getStage().allScene(createAccountPane1);**
        }
   }
}

public Stage getStage(){
      return this.myStage;
}

public void allScene(Pane p){
      this.myStage.setScene(p);
}
Stage-myStage;
公共场景logInScene(){
…所有按钮/文本字段
createAccountButton.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent t){
**this.getStage().allScene(createAccountPane1)**
}
}
}
公共舞台getStage(){
返回这个.myStage;
}
公共场景(窗格p){
this.myStage.setScene(p);
}

setOnAction函数中出现错误。“找不到符号”getStage()。我知道这一定是一个作用域问题,它无法识别该作用域之外的任何变量/函数。我如何使其在该范围内更改?我已尝试传递该变量,但这只会使我的代码变得混乱,我希望有一种更简单的方法。谢谢大家!

只要保持一致性,您的代码就可以工作:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Test extends Application{
    private Stage stage;
    @Override
    public void start(Stage primaryStage) throws Exception {
        stage = primaryStage;
        Scene scene = logInScene();
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public Scene logInScene(){
        Pane root = new Pane();
        Button createAccountButton = new Button("create account");
        createAccountButton.setOnAction(new EventHandler<ActionEvent>(){
            public void handle(ActionEvent t){
                  stage.setScene(CreateAccountScene());
            }
       });
        root.getChildren().add(createAccountButton);
        return new Scene(root);
    }
    protected Scene CreateAccountScene() {
        VBox root = new VBox();
        Label userLabel = new Label("Insert the username:");
        final TextField userField = new TextField();
        Button createAccountButton = new Button("create account");
        createAccountButton.setOnAction(new EventHandler<ActionEvent>(){
            public void handle(ActionEvent t){
                  System.out.println("Account for user " + userField.getText() + " was created succesfully");
            }
       });
        root.getChildren().addAll(userLabel,userField,createAccountButton);
        return new Scene(root);
    }
    public static void main(String[] args) {
        launch(args);
    }

}
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.fxml.fxmloader;
导入javafx.scene.Parent;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Label;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.ancorpane;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类测试扩展了应用程序{
私人舞台;
@凌驾
public void start(Stage primaryStage)引发异常{
阶段=初级阶段;
场景=logInScene();
初级阶段。场景(场景);
primaryStage.show();
}
公共场景logInScene(){
窗格根=新窗格();
Button createAccountButton=新建按钮(“创建帐户”);
createAccountButton.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent t){
stage.setScene(CreateAccountScene());
}
});
root.getChildren().add(createAccountButton);
返回新场景(根);
}
受保护的场景CreateAccountScene(){
VBox root=新的VBox();
Label userLabel=新标签(“插入用户名:”);
final TextField userField=新TextField();
Button createAccountButton=新建按钮(“创建帐户”);
createAccountButton.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent t){
System.out.println(“用户帐户”+userField.getText()+”已成功创建”);
}
});
root.getChildren().addAll(userLabel、userField、createAccountButton);
返回新场景(根);
}
公共静态void main(字符串[]args){
发射(args);
}
}

这个问题已经解决了,但我认为值得澄清的是,您的代码行失败了,因为
This
关键字引用了您正在实现的匿名事件处理程序。在Java中,您使用
OuterClass.This
引用外部类实例。So
OuterClass.This.getStage().allScene(createAccountPane1);
将起作用

如果您正在寻找更漂亮的解决方案,一些程序员喜欢定义一个指向外部类实例的局部变量:

final OuterClass self = this;
createAccountButton.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent t){
              self.getStage().allScene(createAccountPane1);
        }
}
final OuterClass self=此;
createAccountButton.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent t){
self.getStage().allScene(createAccountPane1);
}
}