[英]How to set diffrent scenes of stack pane into root layout JavaFX
我是一名初學者,最近我學習了如何在JavaFX中的場景之間切換。 我想添加帶有某些菜單按鈕的“邊框窗格”(作為這些場景的容器),並在中心設置場景(仍然可以在它們之間切換)。 我應該怎么做或想到? 這是我的代碼:
public class Main extends Application {
public static final String ROOT = "Root";
public static final String ROOT_FXML = "Root.fxml";
public static final String FIRST_SCREEN = "FirstScreen";
public static final String FIRST_SCREEN_FXML = "FirstScreen.fxml";
public static final String SECOND_SCREEN = "SecondScreen";
public static final String SECOND_SCREEN_FXML = "SecondScreen.fxml";
@Override
public void start(Stage primaryStage) {
ScreensController mainContainer = new ScreensController();
mainContainer.loadScreen(Main.FIRST_SCREEN, Main.FIRST_SCREEN_FXML);
mainContainer.loadScreen(Main.SECOND_SCREEN, Main.SECOND_SCREEN_FXML);
mainContainer.setScreen(Main.FIRST_SCREEN);
Group root = new Group();
root.getChildren().addAll(mainContainer);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
}
接口類
public interface ControlledScreen {
public void setScreenParent(ScreensController screenPage);
}
屏幕控制器類
public class ScreensController extends StackPane {
private HashMap<String, Node> screens = new HashMap<>();
public void addScreen(String name, Node screen) {
screens.put(name, screen);
System.out.println("added screen " + name);
}
public boolean loadScreen(String name, String resource) {
try {
FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
Parent loadScreen = (Parent) myLoader.load();
ControlledScreen myScreenControler = ((ControlledScreen) myLoader.getController());
myScreenControler.setScreenParent(this);
addScreen(name, loadScreen);
return true;
} catch (Exception e) {
System.out.println(e.getMessage());
return false;
}
}
public boolean setScreen(final String name) {
if (screens.get(name) != null) {
if (!getChildren().isEmpty()) {
getChildren().remove(0);
// add new screen
getChildren().add(0, screens.get(name));
} else {
getChildren().add(screens.get(name));
}
return true;
} else {
System.out.println("screen hasn't been loaded!\n");
return false;
}
}
public boolean unloadScreen(String name) {
if (screens.remove(name) == null) {
System.out.println("Screen didn't exist");
return false;
} else {
return true;
}
}
}
目前,我有兩個帶有兩個diffrend fxml文件的控制器類。 他們看起來像這樣:
public class FirstScreenController implements ControlledScreen {
ScreensController myController;
@FXML
void initialize() {
}
@Override
public void setScreenParent(ScreensController screenPage) {
myController = screenPage;
}
}
有沒有辦法修復我的代碼?
我解決了問題。 這是新的主班
public class Main extends Application {
public static final String ROOT = "Root";
public static final String ROOT_FXML = "Root.fxml";
public static final String FIRST_SCREEN = "FirstScreen";
public static final String FIRST_SCREEN_FXML = "FirstScreen.fxml";
public static final String SECOND_SCREEN = "SecondScreen";
public static final String SECOND_SCREEN_FXML = "SecondScreen.fxml";
private Stage primaryStage;
private BorderPane rootLayout;
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
ScreensController mainContainer = new ScreensController();
initRootLayout();
mainContainer.loadScreen(Main.FIRST_SCREEN, Main.FIRST_SCREEN_FXML);
mainContainer.loadScreen(Main.SECOND_SCREEN, Main.SECOND_SCREEN_FXML);
mainContainer.setScreen(Main.FIRST_SCREEN);
Group root = new Group();
root.getChildren().addAll(mainContainer);
rootLayout.setCenter(root);
}
public void initRootLayout() {
try {
// Load root layout from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("view/Root.fxml"));
rootLayout = (BorderPane) loader.load();
// Show the scene containing the root layout.
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.