roskenet / springboot-javafx-support

SpringBoot / JavaFX8 Integration
MIT License
422 stars 139 forks source link

How to change the display of the page #87

Open 726903782 opened 5 years ago

726903782 commented 5 years ago

1、 JavaFXApplication.showView(TagInfoDialog.class, Modality.APPLICATION_MODAL);

2、 @FXMLController public class TagInfoController implements Initializable { public void initialize(URL location, ResourceBundle resources) { Platform.runLater(() -> {

    String protocol = CommonSession.Session_Protocol;
    switch (protocol) {
        case "DL/T 645":
            Label lblParam1_dlt645 = new Label("数据项名称:");
            this.hbxRow2.getChildren().add(lblParam1_dlt645);
            break;
        case "CJ/T 188":
            Label lblParam1_cjt188 = new Label("厂商代码:");
            this.hbxRow2.getChildren().add(lblParam1_cjt188);
            TextField txtParam1_cjt188 = new TextField();
            this.hbxRow2.getChildren().add(txtParam1_cjt188);
            break;
    }
    });
}

}

Like the code above, I need to change the display of the page when protocol is a different value. But the initialize method of the above code is only executed once (because it is hidden when the page is closed), and it is not executed again when the protocol value changes. How to change the display of the page

Cyanss commented 4 years ago

Here is my temporary solution:

Step 1:

Use JFxFxmlViewclass replace zhe AbstractFxmlView class

public class JFxFxmlView extends AbstractFxmlView {
    private String value;

    private String[] css;

    private String bundle;

    private String encoding;

    private String title;

    private StageStyle stageStyle;

    private final FXMLView annotation = getFXMLAnnotation();

    public JFxFxmlView () {
        super();
        this.value = this.annotation.value();
        this.css = this.annotation.css();
        this.bundle = this.annotation.bundle();
        this.encoding = this.annotation.encoding();
        this.title = this.annotation.title();
        String style = this.annotation.stageStyle();
        this.stageStyle = StageStyle.valueOf(style.toUpperCase());
    }

    private FXMLView getFXMLAnnotation() {
        Class<? extends AbstractFxmlView> clazz = this.getClass();
        FXMLView annotation = clazz.getAnnotation(FXMLView.class);
        return annotation;
    }
...
...
// getter and setter

Step 2:

Use JFxToolViewManager class realization AbstractJavaFxApplicationSupport class

public class JFxToolViewManager extends AbstractJavaFxApplicationSupport implements InitializingBean {

    @Autowired
    private GxAccountService accountService;

    private static ConfigurableApplicationContext APPLICATION_CONTEXT;
    public static Scene SCENE;
    public static Stage PRIMARY_STAGE;
    public static JFxToolViewManager INSTANCE;

    @Override
    public void afterPropertiesSet() {
        INSTANCE = this;
    }

    @Override
    public void beforeInitialView(Stage stage, ConfigurableApplicationContext ctx) {
        super.beforeInitialView(stage, ctx);
        APPLICATION_CONTEXT = ctx;
        PRIMARY_STAGE = stage;
        //TODO something...

    }

    public static void show(Class<? extends JFxFxmlView> window, Modality mode) {
        JFxFxmlView view = APPLICATION_CONTEXT.getBean(window);
        PRIMARY_STAGE = new Stage();
        if (view.getView().getScene() != null) {
            SCENE = view.getView().getScene();
        } else {
            SCENE = new Scene(view.getView());
        }
        PRIMARY_STAGE.setScene(SCENE);
        PRIMARY_STAGE.initModality(mode);
        PRIMARY_STAGE.initOwner(getStage());
        PRIMARY_STAGE.setTitle(view.getTitle());
        PRIMARY_STAGE.initStyle(view.getStageStyle());
        PRIMARY_STAGE.showAndWait();
    }

    public static void show(Class<? extends JFxFxmlView> window) {
        JFxFxmlView view = APPLICATION_CONTEXT.getBean(window);
        if (GUIState.getScene() == null) {
            SCENE = new Scene(view.getView());
            GUIState.setScene(SCENE);
        }
        showView(window);
    }

    public static void launch(String[] args) {
        launch(JFxToolViewManager.class, JFxToolMainView.class, new JFxSplashView(), args);
    }

  ...
  ...

Step 3 :

Use JFxToolViewManager .show(param , param ) or JFxToolViewManager .show(param ) ,If you want to close zhe current

Stage, you can use JFxToolViewManager .PRIMARY_STAGE.close().

Attention, it's only temporary.