首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaFX -每个阶段的独特场景

JavaFX -每个阶段的独特场景
EN

Stack Overflow用户
提问于 2013-03-20 01:40:17
回答 1查看 7K关注 0票数 0

我有一个扩展Application并调用primary stage的类。这个主要阶段有一个下一步按钮,它将调用另一个阶段(选项阶段)。options阶段有一个“上一个”按钮。我想要获取主阶段的实例,它处于用户单击下一步按钮之前的状态,例如:包含输入数据的文本字段或包含选定项的组合框。我该怎么做呢?

主类:

代码语言:javascript
运行
复制
public class MainClass extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        final FXMLLoader loader = new FXMLLoader(getClass().getResource("interfaceOne.fxml"));
        final Parent root = (Parent)loader.load();
        final MyController controller = loader.<MyController>getController();

        primaryStage.initStyle(StageStyle.TRANSPARENT);
        primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("icon.png")));

        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        Platform.setImplicitExit(false);

        controller.setStage(primaryStage);
        primaryStage.show();        
    }

    public static void main(String[] args) {
        launch(args);
    }

}

MyController:

代码语言:javascript
运行
复制
public class MyController{

    // Some declarations ...

    Stage stage = null;

    public void setStage(Stage stage) {
       this.stage = stage;
    }

    // Next button's action
    @FXML
    public void handleNextAction(ActionEvent event) {

        try {  

            Parent root = FXMLLoader.load(getClass().getResource("optionInterface.fxml"));

            stage.initStyle(StageStyle.TRANSPARENT);
            stage.getIcons().add(new Image(getClass().getResourceAsStream("icon.png")));
            stage.setScene(new Scene(root));
            stage.show();

            // Hide the current screen
            ((Node)(event.getSource())).getScene().getWindow().hide();

        } catch (Exception exc) {
            System.out.println("Error: " + exc.getMessage());
        }
    }
}

选项控制器:

代码语言:javascript
运行
复制
public class OptionsController implements Initializable {

    public void handlePreviousAction(ActionEvent event) {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("interfaceOne.fxml"));;
            MyController controller = MyController.getInstance();

            stage.initStyle(StageStyle.TRANSPARENT);
            stage.getIcons().add(new Image(getClass().getResourceAsStream("icon.png")));
            stage.setScene(new Scene(root));

            controller.setStage(stage);
            controller.isLocationLoaded(false);
            stage.show();

            // Hide the current screen
            ((Node)(event.getSource())).getScene().getWindow().hide();

        } catch (IOException exc) {
            System.out.println("Error: " + exc.getMessage());

        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-20 01:49:38

推荐的方法

为此,不要使用多个stage,而应使用单个stage和多个场景或分层窗格。

示例参考

  1. Angela Caicedo's sophisticated Scene switching tutorial.
  2. A wizard style configuration.

背景

阅读关于JavaFX背后的theater metaphor的讨论,以帮助理解StageScene之间的区别,以及为什么您可能希望在应用程序内外更改场景而不是阶段。

简单样本

我根据你的应用程序描述创建了一个简单的示例,它只是在主场景和选项场景之间来回切换。在场景之间来回切换时,可以看到为主场景和选项场景都保留了场景状态。

对于示例,只有一个阶段引用,它在应用程序的start方法中传递给应用程序,阶段引用保存在应用程序中。应用程序为主屏幕创建一个场景,并为选项屏幕创建另一个场景,保存这两个场景引用将根据需要使用stage.setScene在这些引用之间来回切换当前显示的场景。

该演示故意简单,以便于理解,并且不会持久化所使用的任何数据,也不会使用MVC样式的体系结构或FXML,这在更现实的演示中可能会实现。

代码语言:javascript
运行
复制
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.event.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class RoomReservationNavigator extends Application {
  public static void main(String[] args) { Application.launch(args); }

  private Scene mainScene;
  private Scene optionsScene;
  private Stage stage;

  @Override public void start(Stage stage) {
    this.stage = stage;
    mainScene    = createMainScene();
    optionsScene = createOptionsScene();

    stage.setScene(mainScene);
    stage.show();
  }

  private Scene createMainScene() {
    VBox layout = new VBox(10);
    layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;");
    layout.getChildren().setAll(
      LabelBuilder.create()
        .text("Room Reservation System")
        .style("-fx-font-weight: bold;") 
        .build(),
      HBoxBuilder.create()
        .spacing(5)
        .children(
          new Label("First Name:"),
          new TextField("Peter")
         )
        .build(),
      HBoxBuilder.create()
        .spacing(5)
        .children(
          new Label("Last Name:"),
          new TextField("Parker")
         )
        .build(),
      new Label("Property:"),
      ChoiceBoxBuilder.<String>create()
        .items(FXCollections.observableArrayList(
          "The Waldorf-Astoria", 
          "The Plaza", 
          "The Algonquin Hotel"
        ))
        .build(),
      ButtonBuilder.create()
        .text("Reservation Options  >>")
        .onAction(new EventHandler<ActionEvent>() {
          @Override public void handle(ActionEvent t) {
            stage.setScene(optionsScene);
          }
        })
        .build(),
      ButtonBuilder.create()
        .text("Reserve")
        .defaultButton(true)
        .onAction(new EventHandler<ActionEvent>() {
          @Override public void handle(ActionEvent t) {
            stage.hide();
          }
        })
        .build()
    );

    return new Scene(layout);
  }

  private Scene createOptionsScene() {
    VBox layout = new VBox(10);
    layout.setStyle("-fx-background-color: azure; -fx-padding: 10;");
    layout.getChildren().setAll(
      new CheckBox("Breakfast"),
      new Label("Paper:"),
      ChoiceBoxBuilder.<String>create()
        .items(FXCollections.observableArrayList(
          "New York Times", 
          "Wall Street Journal", 
          "The Daily Bugle"
        ))
        .build(),
      ButtonBuilder.create()
        .text("Confirm Options")
        .defaultButton(true)
        .onAction(new EventHandler<ActionEvent>() {
          @Override public void handle(ActionEvent t) {
            stage.setScene(mainScene);
          }
        })
        .build()
    );

    return new Scene(layout);
  }
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15506634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档