How to change the display of the page
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
Here is my temporary solution:
Step 1:
Use JFxFxmlView class 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.