JavaFX Scene wechseln unter FX

Lacritz

Mitglied
Heyho liebe Java'ler,

ich arbeite mich derzeitig in JavaFX ein und versuche relativ banale Dinge zu programmieren , verstehe aber derzeitig die Funktionsweise von FX nicht.

Derzeitig ist mein Problem ,dass ich 1 Menü habe das beim Klick auf "Spiel Starten" ein weiteres Menü mit "Singleplayer " und "Multiplayer" öffnen soll, hierbei funktioniert aber der scene wechseln nicht.

Java:
package team;

import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;


public class Menu extends Application {

	@Override
	public void start(Stage primaryStage) {

		// Showing Menu

		try {

			/*
			 * Gets StyleSheets of MapSource.fxml (generated with JavaFX Scene
			 * Builder 20
			 */

			/* Overwritten by "Parent root = [...]" */
			// BorderPane root = new BorderPane();

			Parent rootOne = FXMLLoader.load(getClass().getResource(
					"menuSource.fxml"));
			Parent rootTwo = FXMLLoader.load(getClass().getResource(
					"menuStartSource.fxml"));

			Scene menu = new Scene(rootOne, 500, 400);
			Scene menuStart = new Scene(rootTwo, 500, 400);

			if (MenuController.szene  == 0) {
				primaryStage.setScene(menu);
			} else if (MenuController.szene  == 1) {
				primaryStage.setScene(menuStart);
			} else {
				primaryStage.setScene(menuStart);
			}

			// Showing the actual scene
			primaryStage.show();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

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

}

Java:
package team;

import javafx.fxml.FXML;
import javafx.scene.control.Button;

public class MenuController {
    static int szene;

	@FXML
	Button StartGame;

	@FXML
	Button Options;

	@FXML
	Button ExitGame;

	@FXML
	Button Singleplayer;

	@FXML
	Button Multiplayer;

	@FXML
	Button Exit;

	/*
	 * szene: 0 = Menu 1 = StartGame 2 = Options 3 = Exit 4 = SingleplayerStart
	 * 5 = MultiplayerStart
	 */

	@FXML
	protected void buttonPressedMenu() {
		szene = 0;
	}

	@FXML
	protected void buttonPressedStartGame() {
		szene = 1;
	}

	@FXML
	protected void buttonPressedOptions() {
		szene = 2;
	}

	@FXML
	protected void buttonPressedExitGame() {
		szene = 3;
		System.out.print("SYSTEM TERMINATED");
		System.exit(0);
	}

	@FXML
	protected void buttonPressedSingleplayer() {
		szene = 4;
	}

	@FXML
	protected void buttonPressedMultiplayer() {
		szene = 5;
	}
}

Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="team14.MenuController">
   <children>
      <GridPane layoutX="-1.0" layoutY="-1.0" prefHeight="186.0" prefWidth="309.0">
        <columnConstraints>
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="135.0" minWidth="10.0" prefWidth="30.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="135.0" minWidth="10.0" prefWidth="111.0" />
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="194.0" minWidth="0.0" prefWidth="27.0" />
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="182.0" minWidth="10.0" prefWidth="121.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="130.0" minWidth="10.0" prefWidth="30.0" />
        </columnConstraints>
        <rowConstraints>
            <RowConstraints maxHeight="60.0" minHeight="10.0" prefHeight="31.0" vgrow="SOMETIMES" />
          <RowConstraints maxHeight="60.0" minHeight="10.0" prefHeight="31.0" vgrow="SOMETIMES" />
          <RowConstraints maxHeight="31.0" minHeight="0.0" prefHeight="29.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Button mnemonicParsing="false" onAction="#buttonPressedMultiplayer" prefHeight="35.0" prefWidth="117.0" text="Multiplayer" GridPane.columnIndex="3" GridPane.rowIndex="1" />
            <Button mnemonicParsing="false" onAction="#buttonPressedSingleplayer" prefHeight="33.0" prefWidth="115.0" text="Singleplayer" GridPane.columnIndex="1" GridPane.rowIndex="1" />
            <Button alignment="CENTER" mnemonicParsing="false" onAction="#buttonPressedMenu" prefHeight="25.0" prefWidth="85.0" text="Back" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.rowIndex="3" GridPane.valignment="CENTER" />
         </children>
      </GridPane>
   </children>
</AnchorPane>

Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="team14.MenuController">
   <children>
      <GridPane layoutX="-1.0" prefHeight="369.0" prefWidth="494.0">
        <columnConstraints>
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="116.0" minWidth="10.0" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="274.0" minWidth="10.0" prefWidth="269.0" />
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="110.0" minWidth="0.0" prefWidth="67.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Button mnemonicParsing="false" onAction="#buttonPressedStartGame" prefHeight="48.0" prefWidth="299.0" text="Start Game" GridPane.columnIndex="1" GridPane.rowIndex="1">
               <font>
                  <Font size="14.0" />
               </font></Button>
            <Button mnemonicParsing="false" onAction="#buttonPressedOptions" prefHeight="48.0" prefWidth="302.0" text="Options" GridPane.columnIndex="1" GridPane.rowIndex="2">
               <font>
                  <Font size="14.0" />
               </font></Button>
            <Button mnemonicParsing="false" onAction="#buttonPressedExitGame" prefHeight="48.0" prefWidth="298.0" text="Exit Game" GridPane.columnIndex="1" GridPane.rowIndex="3">
               <font>
                  <Font size="14.0" />
               </font></Button>
         </children>
      </GridPane>
   </children>
</AnchorPane>

Es ist derzeitig also wie folgt aufgebaut: Wird auf "Start Game" geklickt wird ein Integer Wert quasi als Leitwert der Szene auf 1 gesetzt , welches dann in der Start Methode das alles wechseln sollte.

Hoffe ihr könnt mir helfen..

Mit freundlichen Grüßen
Lacritz
 
Habe mir jetzt nicht den ganzen Code durchgelesen, aber schon mal primaryStage.setScene(singleplayer) oder ähnliches Versucht ?

mfg Major_Sauce
 
TL;DR

Sorry. Zu viel Kram... Aber von dem was ich sehe, denke ich, dass du einen etwas zu komplexen Ansatz verfolgst. Warum ein kompletter Szenenwechsel? Warum nicht einfach die Nodes auf Scene X austauschen.
Kurz: Leg dir ein weiteres Root-Layout (FXML) an, dass nur eine BorderPane oder so besitzt und dein UI-Wechsel tauscht einfach nur den Center dieser Pane aus. Weitaus schneller und "schmerzfreier"! 🙂

Grüsse
 
Hallo dzim,

Genau an dem Punkt bin ich gerade. Ich möchte in meiner BorderPane lediglich den Center austauschen. Jedoch verstehe ich nicht wie ich ich erstens die verschiedenen Ansichten im Center im Scene Builder programmieren muss und wie ich den Center anschließend austausche. Kannst du mir erklären, wie ich das realisieren kann?
Vielen Dank!
 
warum die ganze szene wechseln ?

der button der den "szene" wechsel machen sollte ruft auf

event.getTarget().getScene().setRoot(FXMLLoader(newsviewblabla))

im zweifelsfall selber programmieren
 
Hallo dzim,

Genau an dem Punkt bin ich gerade. Ich möchte in meiner BorderPane lediglich den Center austauschen. Jedoch verstehe ich nicht wie ich ich erstens die verschiedenen Ansichten im Center im Scene Builder programmieren muss und wie ich den Center anschließend austausche. Kannst du mir erklären, wie ich das realisieren kann?
Vielen Dank!
wenn der button geklickt wird machst du einen fxmlloader und castest es in einen node und setzt den node in die borderpane center
außerdem wo hast du diesen thread ausgegraben ??
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben