JavaFX Variablen in einem FXML File verwenden

Hallo,

erster Post und FX-Anfängerin.

Ich versuche gerade ein Spiel zu programmieren, bei dem man sich verschiedene Spieler aussuchen kann. Jeder dieser Spieler kann verschiedene Items besitzen. (Im FXML ist jetzt nur das Beispiel Gold ausgeführt.) Für die Anzeige EINES Spielers habe ich ein FXML entworfen, das ich jetzt für ALLE Spieler verwenden möchte. Mein Problem ist folgendes: die Items der verschiedenen Spieler müssen ja jeweils eigene IDs besitzen, damit ich das jeweils richtige Item ansprechen kann. Kann man die fx ids irgendwie generisch erzeugen?

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

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

<SplitPane dividerPositions="0.75" maxHeight="-Infinity"
    maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
    prefHeight="400.0" prefWidth="600.0" 
    xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="controller.GameController">
    <items>
        <AnchorPane prefHeight="200.0" prefWidth="200.0">
            <children>
                <!--weiterer Code-->
            </children>
        </AnchorPane>
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="100.0">              
                <children>
                    <Label prefHeight="17.0" prefWidth="75.0" text="Gold" />
                    <!--HIER SOLL DIE ID GENERISCH FÜR JEDEN SPIELER EINGESETZT WERDEN, z.B. player1NumberOfGold usw.-->
                    <TextField fx:id="numberOfGold" maxHeight="-Infinity"
                        maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
                        prefHeight="25.0" prefWidth="25.0" />
                </children>
        </AnchorPane>
    </items>
</SplitPane>
 
Ich bin mir nicht zu 100% sicher, ob ich es verstehe, aber ich denke, du müsstest deine Daten (und das UI) pro Spieler dynamisch im Controller des FXML händeln. Du kannst dort natürlich einfach wieder den UI-Part über FXML lösen, aber welcher (UI-)Block zu welchem Spieler gehört (und auch wie viele es davon geben soll), musst du in deiner Programmlogik verwalten.
 
Na ich habe zuerst ein Formular, in dem ich 2-4 Spieler aussuchen kann. Diese ausgesuchten Spieler packe ich in eine Liste, über die ich itterieren möchte, quasi: für jeden Spieler in der Liste erstelle ein Spielerfeld mittels dem fxml im Haupt fxml (hier habe ich eine HBox, wo die Spieler UI rein sollen). Und genau hier liegt mein Problem... Wie mach ich das bloss? Ich such mich im Netz schon wund, habe bisher aber noch nix hilfreiches gefunden :-(
 
Im Prinzip brauchst du so etwas wie das hier:
Root-FXML (in dem Beispiel wirklich der Root der Application):
https://github.com/bgmf/poc/blob/master/simple-tests-fx/src/main/resources/fxml/Root.fxml
Das wird via FXMLLoader in der Start-Methode der JavaFX-Application geladen:
https://github.com/bgmf/poc/blob/master/simple-tests-fx/src/main/java/eu/dzim/tests/fx/MainRoot.java
Und der Inhalt wird dynamisch aus anderen FXMLs nachgeladen:
https://github.com/bgmf/poc/blob/master/simple-tests-fx/src/main/java/eu/dzim/tests/fx/controller/RootController.java

Der Unterschied zu dir ist, dass du halt im "RootController" (letztes Beispiel) halt nicht komplette Inhalte ersetzt, sonder anhand deiner Iteration über deine Liste X Oberflächen in deine HBox einfügst.
 
Das hieße aber, dass ich für jeden Spieler einen eigenen Controller anlegen muss, richtig?
Geht denn da dann die Interaktion noch? Also wenn ich zum Beispiel ein Goldstück vom Spielplan (was im grunde mein Root fxml ist) auf einen der Spieler dragge, dass das Goldstück bei dem Spieler ankommt?
 
Naja, du schreibst natürlich nur einmal einen Controller... ;) Aber für Drad & Drop muss halt der Root eine DragSource und die Spieler-UI ein DragTarget sein. Es sollte also problemlos klappen. Ich gebe zu, dass ich bisher meist um Drag & Drop herumgekommen bin. Aber auch wenn die Beispiele für DnD meist dies nur innerhalb einer UI zeigen, geht das natürlich auch über die Grenzen von FXMLs und deren Controllern hinaus.
 
Also einen Controller für alle Spieler (logisch, jeder Spieler muss ja das selbe machen können), das selbe fxml (auch klar, weil der Aufbau der UI für jeden Spieler gleich ist) und dann habe ich aber immer noch mein Hauptproblem: Wie unterscheide ich die einzelnen Spieler? Sorry, ich hab grad anscheinend nen Hänger...
 
Deine Spieler-spezifische UI müsste einen Setter für den Spieler besitzen. Es gibt da bereits so einige Beiträge hier im Forum, wenn du z.B. nach "ControllerFactory" suchst.

Beispiel von @Robat - https://www.java-forum.org/thema/listview-zeigt-eintraege-nicht-an.185003/#post-1185779

In meinem Git-Repository gibt es auch ein paar Beispiele:
https://github.com/bgmf/poc/blob/master/simple-tests-fx/src/main/java/eu/dzim/tests/fx/MainWithControllerFactory.java
https://github.com/bgmf/poc/blob/master/simple-tests-fx/src/main/java/eu/dzim/tests/fx/MainWithControllerFactory2.java
...

Der Clou ist, dass du damit Daten in einen Controller injizieren kannst, bevor das UI initialisiert wird (#initialize-Methode). Dein Controller kann dann das Spieler-UI entsprechend einrichten, so dass Spielerrelevante Daten angezeigt werden. Möglicherweise auch mit der Aktualisierung eines zentralen Models, wenn du dieses auch injizierst.
Schau dir dir ganzen Beispiele mal an.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben