2016-07-21 10 views
2

Ich habe zwei Objekte in einem FXML-Dokument definiert. Ich möchte, dass einer von ihnen eine Referenz, die ebenfalls in FXML definiert ist, mit der anderen verknüpft. Das FXML-Element des Objekts, das das andere Objekt hat, kommt zuerst im Dokument. Beim Laden über javafx.fxml.FXMLLoader bleibt die Eigenschaft nicht zugewiesen. Es does zuweisen die Eigenschaft, wenn das Objekt, das das andere Objekt hat, kommt an zweiter Stelle. Gibt es eine Möglichkeit, der Eigenschaft eines Objekts, das früher im FXML-Dokument kommt, einen Objektverweis zuzuordnen?Wie erstelle ich einen Verweis auf ein Objekt vor dem Element des Objekts in FXML?

Hier ist ein minimales vollständiges überprüfbares Beispiel. Das Objekt, das einen Verweis auf einen anderen hat und vor es kommt, bekommt seine Eigenschaft nicht zugewiesen, und beim Testen ist es null. Diejenige, die nach dem Objekt kommt, auf das sie verweist, erhält ihre Eigenschaft zugewiesen und gibt die toString() des Objekts aus.

issue.fxml:

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

<HBox xmlns:fx="http://javafx.com/fxml/1" id="pane1" prefHeight="400.0" prefWidth="600.0"> 
    <FriendlyButton fx:id="priorObjectReference" friend="$normalButton" /> 
    <Button fx:id="normalButton" /> 
    <FriendlyButton fx:id="subsequentObjectReference" friend="$normalButton" /> 
</HBox> 

FXMLIssue.java, Lasten über FXML und die Objektreferenzen zu drucken versucht:

import java.io.IOException; 
import java.nio.file.Paths; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.control.Button; 
import javafx.stage.Stage; 
import test.control.FriendlyButton; 

public class FXMLIssue extends Application { 
    @Override 
    public void start(Stage stage) { 
     Parent container = null; 
     try { 
      container = FXMLLoader.load(Paths.get("issue.fxml").toUri().toURL()); 
     } catch (IOException ex) { 
      Logger.getLogger(FXMLIssue.class.getName()).log(Level.SEVERE, "Failed to load file.", ex); 
      Platform.exit(); 
     } 

     FriendlyButton priorObjectReference = (FriendlyButton) container.lookup("#priorObjectReference"); 
     System.out.println(priorObjectReference.getFriend() == null ? "priorObjectReference's friend property wasn't loaded from FXML" : "priorObjectReference's friend is: " + priorObjectReference.getFriend().toString()); 

     FriendlyButton subsequentObjectReference = (FriendlyButton) container.lookup("#subsequentObjectReference"); 
     System.out.println(subsequentObjectReference.getFriend() == null ? "subsequentObjectReference's friend property wasn't loaded from FXML" : "subsequentObjectReference's friend is: " + subsequentObjectReference.getFriend().toString()); 

     Platform.exit(); 
    } 

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

FriendlyButton.java, nur eine Klasse, die eine Eigenschaft hat, dass verweist auf ein anderes Objekt in FXML:

package test.control; 

import javafx.scene.control.Button; 

public class FriendlyButton extends Button { 
    private Button mFriend; 

    public Button getFriend() { 
     return mFriend; 
    } 

    public void setFriend(Button friend) { 
     mFriend = friend; 
    } 
} 

Antwort

2
<HBox xmlns:fx="http://javafx.com/fxml/1" id="pane1" prefHeight="400.0" prefWidth="600.0"> 
    <fx:define> 
     <Button fx:id="normalButton" /> 
    </fx:define> 
    <FriendlyButton fx:id="priorObjectReference" friend="$normalButton" /> 
    <fx:reference source="normalButton" /> 
    <FriendlyButton fx:id="subsequentObjectReference" friend="$normalButton" /> 
</HBox> 
+0

Dies ist eine gute Lösung. Es würde die Qualität der Antwort jedoch nicht verletzen, wenn Sie 1 oder 2 Sätze hinzufügen würden, die erklären, wie das funktioniert ... +1 nichtsdestotrotz – fabian

+0

@fabian Leider ist mein Sprachniveau sehr gering. –