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!

Cela ressemble à une surutilisation de l'héritage à moi: pensez à utiliser l'agrégation de la place. Mais, pour réellement faire de la manière que vous voulez, ne pourriez-vous utiliser un <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