Contrôle statique en tant que champ dans JavaFX


Si je crée une classe, par exemple MyContainer et que j'ai une étiquette en tant que champ et que je la rends statique, je crée deux instances de MyContainer et je l'ajoute à ma scène globale.

J'aurais pensé qu'après avoir créé les deux instances de MyContainer, j'avais mis à jour le texte de l'étiquette via une méthode publique, qu'il le mettrait à jour pour les deux étiquettes, mais il ne se comporte pas comme ça.

Je ne sais pas non plus comment FX traiterait les contrôles statiques (ou même les nœuds dans un sens plus général) comme il unis dans l'API qu'une seule instance d'un nœud dans le graphe de scène?

J'ai ajouté un exemple ci-dessous, car je semble avoir légèrement affiné le problème:

public class ApplicationLoader extends Application {

    public void start(Stage stage) throws Exception {

        ButtonPane bp1 = new ButtonPane();

        ButtonPane bp2 = new ButtonPane();

        bp1.modify(); //modifies b1 Button text of bp2?

        VBox root = new VBox(20, bp1, bp2);

        stage.setScene(new Scene(root));
        stage.show();
    }

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

    public static class ButtonPane extends HBox {

        private static Button b1; //even though b1 is static it appears to be added twice?
        private static Button b2 = new Button("Button 2");
        private Button b3;

        public ButtonPane() {
            setSpacing(10);
            b1 = new Button("Button 1");
            b3 = new Button("Button 3");
            this.getChildren().addAll(b1, b2, b3);
        }

        public void modify() {
            b1.setText(b1.getText() + " Modified");
        }
    }

}

Lorsque vous déclarez le bouton b2 comme statique et que vous l'initialisez au point de déclaration, il n'apparaît que dans la 2ème instance de ButtonPanel, c'est-à-dire bp2. Avec le bouton b1 qui est également statique mais initialisé dans le constructeur, il est ajouté aux deux. Cependant, seule la 2ème instance bp2 est modifiée, ce qui entraîne ceci:

démo statique de comportement FX

Author: Tranquility, 2016-02-15

1 answers

Un nœud ne peut apparaître qu'une seule fois dans le graphique de scène. Si vous rendez une référence de nœud statique, il n'y a qu'une seule instance de ce nœud. Si vous essayez d'ajouter ce nœud à deux parents différents, les résultats ne sont pas définis. Le comportement le plus probable (et celui qui est observé si vous essayez réellement ceci) est que si le nœud est déjà un enfant d'un parent, alors lorsque vous l'ajoutez à un deuxième parent, il sera supprimé du premier.

Voici un SSCCE:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class AddLabelMultipleTimes extends Application {

    @Override
    public void start(Stage primaryStage) {


        MyContainer myContainer1 = new MyContainer("Button 1");

        MyContainer.setLabelText("Label");

        MyContainer myContainer2 = new MyContainer("Button 2");

        VBox root = new VBox(5, myContainer1, myContainer2);



        root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(root, 350, 180);
        primaryStage.setScene(scene);
        primaryStage.show();


    }

    public static class MyContainer extends HBox {

        private static int count = 1 ;

        private static Label label = new Label();
        private Button button ;

        public MyContainer(String buttonText) {
            button = new Button(buttonText);
            button.setOnAction(e -> setLabelText("Count "+(count++)));
            getChildren().addAll(label, button);
            setSpacing(5);
            setAlignment(Pos.CENTER);
        }

        public static void setLabelText(String text) {
            label.setText(text);
        }
    }

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

Dans cet exemple, le l'étiquette statique est d'abord ajoutée à myContainer1. Ensuite, il est ajouté à myContainer2. Lorsque cela se produit, il est supprimé de son parent précédent, il n'apparaît donc que dans le deuxième conteneur comme indiqué dans la capture d'écran:

entrez la description de l'image ici

 0
Author: James_D, 2016-02-15 22:20:06