Problema con JavaFX

di il
3 risposte

Problema con JavaFX

Buonasera a tutti! Sto provando ad esercitarmi con JavaFX, ma sto avendo un po' di problemi quando gestito Eventi con il mouse ad esempio!
In particolare, quando tocco un tasto, vorrei che la vecchia figura presente venisse cambiata con un'altra. Ad esempio da un cerchio ad un rettangolo. Purtroppo però usando il mio codice, la figura non viene aggiornata. Mentre se inserisco un testo (chiamato text ) e nella ActionEvent inserisco text.setText("nuova parola") allora il testo viene aggiornato. Come mai? Spero di essere stata chiara. Ecco il codice in cui vorrei cambiare la figura centrale da rettangolo a cerchio. Grazie a chi risponderà!!!

public class Prova extends Application {
    Button tutti=new Button ("Tutti");
    Button donne=new Button ("Donne");
    Button uomini=new Button ("Uomini");
    Button cani=new Button ("cani");
    Button gatti=new Button ("gatti");
    Button cerchio=new Button ("Cerchio");
    Text text= new Text("Prova prova");
    Shape r= new Rectangle(50,50);
    
    Circle c=new Circle(20,20,20);
    
    
    @Override
    public void start(Stage primaryStage) {
        
        r.setFill(Color.BLUE);
        
        AnchorPane anchor1=new AnchorPane();
        AnchorPane anchor2=new AnchorPane();
        
        
        HBox hbox1=new HBox();
        hbox1.setSpacing(10);
        hbox1.getChildren().addAll(tutti,donne,uomini);
        
        HBox hbox2=new HBox();
        hbox2.setSpacing(10);
        hbox2.getChildren().addAll(cani,gatti);
        
        anchor1.getChildren().addAll(hbox1,hbox2);
        anchor1.setLeftAnchor(hbox1,8.0);
        anchor1.setRightAnchor(hbox2,8.0);
        
       
        anchor2.getChildren().add(cerchio);
        anchor2.setBottomAnchor(cerchio, 8.0);
        anchor2.setRightAnchor(cerchio, 5.0);
        
        BorderPane border=new BorderPane();
        border.setTop(anchor1);
        border.setCenter(r);
        border.setBottom(anchor2);
        
        cerchio.setOnAction(new EventHandler<ActionEvent>() {
            
            @Override
            public void handle(ActionEvent event) {
                
                r=new Circle(10,10,10);
             
            }
        });
        Scene scene = new Scene(border,400,250);
        
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
}

3 Risposte

  • Re: Problema con JavaFX

    Sectioaurea3 ha scritto:


    Purtroppo però usando il mio codice, la figura non viene aggiornata. Mentre se inserisco un testo (chiamato text ) e nella ActionEvent inserisco text.setText("nuova parola") allora il testo viene aggiornato. Come mai?
    Il vero problema è che parti dal presupposto sbagliato, cioè che: se assegni un nuovo oggetto ad una TUA variabile (di istanza) della TUA classe, ti aspetti che qualcosa debba accadere a video.
    No, non è così che funzionano le cose. In JavaFX ma anche in qualunque altro framework es. AWT o Swing.

    Quello che si vede a video è il risultato di una struttura (ad "albero") fatta di tanti "nodi" (tutte le estensioni di javafx.scene.Node) che ha come "radice" lo Stage, che è il contenitore top level (di più alto livello) in JavaFX.

    Come vedi, per creare quella struttura hai fatto una serie di operazioni, su un hbox1 hai preso la lista dei children ("figli") che appena creato il HBox è inizialmente vuota e gli hai aggiunto 3 nodi figli. E così per il resto.

    Per cambiare qualcosa a video a seguito di un evento quindi ci sono diverse possibilità. La più semplice: cambiare una proprietà di un nodo. Ad esempio una proprietà come il "text" di un componente che mostra del testo.

    Se all'inizio metti:
    Rectangle r= new Rectangle(50,50);

    e poi nel handle() metti:
    r.setWidth(r.getWidth() + 10);

    Ad ogni click su Cerchio, il rettangolo si espande in larghezza. In questo caso NON hai cambiato quella struttura ad albero ma solo una caratteristica di un nodo già presente nella struttura.

    Dato che nel handle hai "visibilità" della variabile border di tipo BorderPane, se nel handle metti:

    border.setCenter(new Circle(20,20,20));

    Allora vai a cambiare in piccola parte quella struttura ad albero, cioè uno dei sotto-nodi del BorderPane diventa un Circle invece che il vecchio Rectangle.

    Tutto chiaro, adesso?
  • Re: Problema con JavaFX

    Per cambiare qualcosa a video a seguito di un evento quindi ci sono diverse possibilità. La più semplice: cambiare una proprietà di un nodo.
    Un'alternativa potrebbe essere quella di dichiarare un Parent (tipo StackPane o altro), inserire all'interno il rettangolo iniziale e poi nella handle() modificare il Parent (svuotandolo ed inserendo il cerchio)? In questo caso al centro del BorderPane inserirei il Parent.

    Però forse questo modo diventa ridondante. Quali potrebbero essere gli altri modi?
    Grazie comunque per la risposta! Questo problema mi ha fatto penare
  • Re: Problema con JavaFX

    Sectioaurea3 ha scritto:


    Un'alternativa potrebbe essere quella di dichiarare un Parent (tipo StackPane o altro), inserire all'interno il rettangolo iniziale e poi nella handle() modificare il Parent (svuotandolo ed inserendo il cerchio)? In questo caso al centro del BorderPane inserirei il Parent.

    Però forse questo modo diventa ridondante. Quali potrebbero essere gli altri modi?
    Sì. Ma come ripeto, le possibilità per cambiare qualcosa a video sono principalmente due: o cambi le proprietà dei nodi o alteri la struttura dei nodi. Poi come lo fai, in quale punto della struttura lo fai e a seguito di quale evento .... lo puoi decidere tu.

    L'unica cosa, per buon senso/buona programmazione, è che devi tenerti da parte (come variabili di istanza o "locali" purché accessibili dove c'è la gestione dell'evento) i riferimenti agli oggetti e ai contenitori che intendi modificare, in modo da non dover fare giri "rocamboleschi" per rintracciarli.
    Questo a JavaFX non interessa, cioè spetta a te organizzare le variabili in modo da mantenere i riferimenti agli elementi che sono anche nella struttura che poi sai di dover modificare.
Devi accedere o registrarti per scrivere nel forum
3 risposte