Personnalisé JavaFX contrôle “de la racine de la valeur déjà spécifié de Scène” Builder 2.0
J'ai mis en place un contrôle personnalisé, à l'aide d'un fichier fxml et une classe Java, similaire à ce qui est expliqué dans ce tutoriel officiel (voir le code ci-dessous). Notez que le fxml de l'élément racine est définie avec fx:root
et j'appelle setRoot
par programmation.
J'ai essayé, y compris le contrôle dans le FXML mise en page d'une application, et à la charge de l'application de l'amende (et affiche le contrôle comme prévu).
Cependant, si j'essaie d'importer un fichier jar contenant mon contrôle en Scène Builder 2.0, le contrôle n'apparaît pas dans la liste des composants à l'importation (à la différence de certains autres contrôles dans le même pot). Si je sélectionne "Afficher le BOCAL Rapport d'Analyse", il affiche une erreur causée par javafx.fxml.LoadException: Root value already specified
.
Savez-vous pourquoi j'ai cette erreur lors du chargement de la Scène Constructeur, même si elle se charge correctement dans une application réelle?
Voici le FXML :
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>
<fx:root type="javafx.scene.layout.GridPane" id="MediaMetadataDisplay" hgap="20.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0"
prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<columnConstraints>
<ColumnConstraints fillWidth="false" hgrow="NEVER" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="200.0"/>
<ColumnConstraints halignment="LEFT" hgrow="ALWAYS"/>
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="40.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="25.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="25.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="25.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="25.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<children>
<ImageView id="coverView" fx:id="coverView" fitHeight="200.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.rowSpan="7"/>
<Label id="trackName" fx:id="trackName" maxWidth="1.7976931348623157E308" text="trackName" GridPane.columnIndex="1" GridPane.rowIndex="1">
<font>
<Font name="System Bold" size="16.0"/>
</font>
</Label>
<Label id="artist" fx:id="artist" maxWidth="1.7976931348623157E308" text="artist" GridPane.columnIndex="1" GridPane.rowIndex="2"/>
<Label id="album" fx:id="album" maxWidth="1.7976931348623157E308" text="album" GridPane.columnIndex="1" GridPane.rowIndex="3"/>
<Label id="genre" fx:id="genre" maxWidth="1.7976931348623157E308" text="genre" GridPane.columnIndex="1" GridPane.rowIndex="4"/>
<Label id="trackNumber" fx:id="trackNumber" maxWidth="1.7976931348623157E308" text="trackNumber" GridPane.columnIndex="1" GridPane.rowIndex="5"/>
</children>
</fx:root>
Et la Java contrôleur/élément racine:
package customjavafx.scene.control;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.media.Media;
import java.io.IOException;
import java.util.Map;
public class MediaMetadataDisplay extends GridPane {
public MediaMetadataDisplay() {
final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MediaMetadataDisplay.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
media.addListener((obs, oldVal, newVal) -> updateMedia(newVal));
}
private final ObjectProperty<Media> media = new SimpleObjectProperty<>((Media) null, "media");
@FXML private ImageView coverView;
@FXML private Label trackName;
@FXML private Label artist;
@FXML private Label album;
@FXML private Label genre;
@FXML private Label trackNumber;
public void updateMedia(Media media) {
//TODO show updated metadata
}
public ObjectProperty<Media> mediaProperty() {
return media;
}
public Media getMedia() {
return mediaProperty().get();
}
public void setMedia(final Media media) {
mediaProperty().set(media);
}
}
La cause de l'erreur, dans la stacktrace illustré par la Scène Constructeur :
Caused by: javafx.fxml.LoadException: Root value already specified.
file:/Users/guillaumegaly/Library/Application%20Support/Scene%20Builder/Library/custom-controls_2.11.jar!/customjavafx/scene/control/MediaMetadataDisplay.fxml
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2613)
at javafx.fxml.FXMLLoader.createElement(FXMLLoader.java:2771)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2720)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at customjavafx.scene.control.MediaMetadataDisplay.<init>(MediaMetadataDisplay.java:26)
... 18 more
J'avais vu ce tutoriel trop, il ne semble pas différent pour moi, en dehors de l'extension d'une mise en page différente (AnchorPane vs GridPane). J'ai posté ma question sur l'Oracle des forums comme vous l'avez suggéré, nous allons voir comment il va.
OriginalL'auteur Cyäegha | 2014-09-08
Vous devez vous connecter pour publier un commentaire.
Supprimer la ligne
Votre FXML définit la racine à une AnchorPane (et vous ne pouvez pas définir la racine de deux fois, ce qui est pourquoi vous obtenez le message d'erreur).
Je suis très reconnaissant pour ce post
La racine de la valeur déjà spécifié
setRoot
, alors comment serait-il savoir où fixer les composants?Fx:racine de la balise racine du jeu pour vous.Il s'agit essentiellement de javafx. Fichier Fxml
J'ai en quelque sorte avoir le problème inverse (lors de l'utilisation de la
<fx:root...
syntaxe dans le .fichier fxml), si je ne l'appelez passetRoot()
, je reçois unno root specified
erreur.OriginalL'auteur swapyonubuntu
J'ai été à la suite de la Javafx FXML tutoriels sur la documentation, et j'ai coincé sur la section composants personnalisés. Le problème pour moi est que quand j'ai appelé le setRoot méthode, il serait de lancer une "Racine déjà indiqué" erreur. Personnellement, j'ai résolu ce problème en ajoutant la balise racine dans le composant personnalisé FXML document. Il fonctionne maintenant.
Je suis en ajoutant ce donc si quelqu'un d'autre a le même problème, Google peut leur donner la réponse.
OriginalL'auteur Dean Irwin