Controllo statico come campo in JavaFX


Se creo una classe, ad esempio MyContainer e ho un'etichetta come campo e la faccio statica, creo due istanze di MyContainer e la aggiungo alla mia scena generale.

Avrei pensato se dopo aver creato le due istanze di MyContainer, aggiornassi il testo dell'Etichetta tramite un metodo pubblico, che lo aggiornerebbe per entrambe le Etichette, ma non si comporta in questo modo.

Inoltre, non so come FX gestirebbe i controlli statici (o anche i nodi in senso più generale) in quanto afferma nell'API che solo un'istanza di un nodo può esistere nel grafico della scena?

Ho aggiunto un esempio qui sotto, come mi sembra di aver affinato leggermente il problema:

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");
        }
    }

}

Quando si dichiara il pulsante b2 come statico e lo si inizializza nel punto di dichiarazione, viene visualizzato solo nella 2a istanza di ButtonPanel, ovvero bp2. Con il pulsante b1 che è anche statico ma inizializzato nel costruttore viene aggiunto a entrambi. Tuttavia, solo la 2a istanza bp2 viene modificata, risultando in questo:

demo del comportamento FX statico

Author: Tranquility, 2016-02-15

1 answers

Un nodo può apparire solo una volta nel grafico della scena. Se si rende statico un riferimento al nodo, esiste solo un'istanza di quel nodo. Se si tenta di aggiungere quel nodo a due genitori diversi, i risultati non sono definiti. Il comportamento più probabile (e quello osservato se si prova effettivamente questo) è che se il nodo è già figlio di un genitore, quando lo si aggiunge a un secondo genitore verrà rimosso dal primo.

Ecco 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);
    }
}

In questo esempio, il l'etichetta statica viene prima aggiunta a myContainer1. Quindi viene aggiunto a myContainer2. Quando ciò si verifica, viene rimosso dal genitore precedente, quindi appare solo nel secondo contenitore come visto nello screenshot:

inserisci qui la descrizione dell'immagine

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