Comment étendre personnalisé JavaFX les composants qui utilisent le FXML
Comment étendre une coutume JavaFX composant à ajouter ou à modifier ses composants GUI si elle utilise FXML pour la vue?
Comme un scénario d'exemple, supposons que j'ai utiliser l'approche suivante de la création d'une coutume JavaFX composant:
SpecializedButton.java (Contrôleur)
package test;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
public class SpecializedButton extends HBox
{
@FXML private Button button;
@FXML private Label label;
public SpecializedButton()
{
FXMLLoader loader = new FXMLLoader( getClass().getResource( "SpecializedButton.fxml" ) );
loader.setRoot( this );
loader.setController( this );
try {
loader.load();
} catch ( IOException e ) {
throw new RuntimeException( e );
}
}
//specialized methods for this specialized button
//...
public void doSomething() {
button.setText( "Did something!" );
}
}
SpecializedButton.fxml (Vue)
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.Button?>
<fx:root type="HBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<AnchorPane HBox.hgrow="ALWAYS">
<children>
<Label fx:id="label" text="Click to do something: " AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
<AnchorPane HBox.hgrow="ALWAYS">
<children>
<Button fx:id="button" onAction="#doSomething" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
</children>
</fx:root>
MyApp.java
package test;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class MyApp extends Application
{
public static void main( String[] args )
{
launch( args );
}
public void start( Stage stage ) throws Exception
{
stage.setScene( new Scene( new SpecializedButton(), 300, 50 ) );
stage.show();
}
}
La SpecializedButton charges de classe le FXML vue (SpecializedButton.fxml) et agit en tant que contrôleur.
La SpecializedButton FXML vue crée une HBox avec deux AnchorPanes et une Étiquette et Bouton dans le côtés gauche et droit, respectivement. Lorsque le bouton est cliqué, il appelle doSomething() dans le SpecializedButton contrôleur de classe.
Problème
Avec cette configuration, je suis en utilisant FXML pour séparer le point de vue de la logique de l'application.
Cependant, si je veux créer un nouveau HighlySpecializedButton classe qui étend la classe SpecializedButton, je ne sais pas comment faire pour aller sur "l'extension" de la vue.
Si je voulais utiliser le SpecializedButton vue, mais de le modifier pour le HighlySpecializedButton, je dois copier le code dans un nouveau fichier FXML, résultant en un code en double au lieu de bon héritage.
Si je n'étais pas à l'aide de FXML, et a été la création de composants de l'interface utilisateur à l'intérieur d'une classe Java au lieu de cela, l'extension de cette classe serait de me donner la possibilité de bien hériter et d'ajouter/modifier les composants de la super-classe.
Je suis clairement l'incompréhension de certains concepts très importants sur JavaFX.
Question
Sont FXML vues dans ce cas, si "bête" que j'aurais à en créer un tout nouveau FXML vue à chaque fois que j'ai voulu hériter d'un composant personnalisé?
Ou, si je suis l'incompréhension, le vrai problème, ce est la bonne façon de créer extensible personnalisé JavaFX composants, avec ou sans FXML?
Je serais grandement apprécier toute la perspicacité. Merci à l'avance!
<fx:include>
? Sinon, juste le FXML
pour la "sous-classe de la composante" référence à un <SpecializedButton>
.Autre question: Avez-vous déjà prolongé d'un document html? FXML est scriptable, basé sur XML, langage de balisage pour la construction de Java les graphes d'objets. C'est à partir de la docu ici: docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/...
OriginalL'auteur ThatGuyThatDoesThings | 2015-07-22
Vous devez vous connecter pour publier un commentaire.
De ce que je comprends, vous voulez être en mesure d'étendre les composants existants et d'éviter
copie & collage de l'ensemble de la majoration pour le nouveau composant.
Vous pouvez définir un point d'extension pour le composant avec le
@DefaultProperty
annotation.Regarder e.x.
javafx.scene.layout.Pane
: Il y a unObservableList getChildren()
défini avec
@DefaultProperty("children")
.De cette façon, lorsque vous utilisez l'e.x un
HBox
(s'étend Volet) comme l'élément racine de votre composant, tous les enfants composants sont ajoutés à lachildren
propriété définie par le Volet.De la même manière, vous pouvez définir des points d'extension dans le FXML:
SpecializedButton.fxml (je l'ai simplifié un peu pour cet exemple)
La
HBox fx:id="extension"
sera mon point d'extension:SuperSpecializedButton.fxml
Et:
Comme vous pouvez le voir, j'ai besoin seulement de définir fxml pour le super-spécialisés composant.
Ce code ne fonctionne que sur JavaFX >= 2.1. L'avance à l'injection de composants pour la super-classe n'a pas fonctionné avec le FXMLLoader.
J'ai ajouté un exemple de travail sur github: https://github.com/matrak/javafx-extend-fxml
OriginalL'auteur mrak
Je n'ai pas fait cela avant, mais vous pourriez mettre en œuvre les Initializable interface de configuration de la vue de composant lorsque vous instanciez un nouveau composant personnalisé.
À ajouter de nouveaux éléments(étiquettes, boutons, img, etc...) je l'emballage de tous les enfants de la composante sur le fichier de vue, au sein d'une AnchorPane, GridPane, VBox ou celui que vous préférez ajouter les autres composants de la programmation. Depuis que vous êtes à l'extension de votre classe à partir de HBox vous pouvez le faire déjà.
Voici ce que je ferais:
Donc pour le HighlySpecializedButton classe:
Espère que cela pourrait vous aider à
Il a également demandé "quelle est la bonne façon de créer extensible personnalisé JavaFX composants, avec ou sans FXML?"
OriginalL'auteur Miguel Cardenas