Ich bin ein Anfänger-Programmierer und vor kurzem habe ich gelernt, wie man zwischen Szenen in JavaFX wechselt. Ich möchte ein Rahmenfenster (als Container für diese Szenen) mit einigen Menüschaltflächen hinzufügen und Szenen in der Mitte festlegen (und trotzdem zwischen ihnen wechseln können). Was soll ich tun oder denken? Hier ist mein Code:Wie man verschiedene Szenen des Stack-Bereichs in das Root-Layout einstellt 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();
}
}
Interfaceklasse
public interface ControlledScreen {
public void setScreenParent(ScreensController screenPage);
}
Screens Controller-Klasse
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;
}
}
}
Im Moment habe ich zwei Controller-Klassen mit zwei diffrend fxml Dateien. Sie sehen so aus:
public class FirstScreenController implements ControlledScreen {
ScreensController myController;
@FXML
void initialize() {
}
@Override
public void setScreenParent(ScreensController screenPage) {
myController = screenPage;
}
}
Gibt es eine Möglichkeit, meinen Code zu beheben?
Erhalten Sie eine Ausnahme? oder wird gar nichts angezeigt? Wo ist das genaue Problem, das behoben werden sollte? – user7291698
Ich möchte "ersten Bildschirm" oder "zweiten Bildschirm" (und wechseln zwischen ihnen) in der Mitte der "root" (das ist Grenzbereich). Atm Ich kann zwischen dem ersten und zweiten Bildschirm wechseln, aber ich weiß nicht, wie man "root" implementiert – tedunioo24cm