2016-03-22 8 views
1

Ich möchte ein Modell für mein Projekt einrichten, damit meine Controller miteinander kommunizieren können. Ich möchte, dass es einen Setter und Getter hat, um einen einfachen Zugriff auf bestimmte Knoten aus beiden Klassen zu ermöglichen.CSS Style-Eigenschaft an Knoten in JavaFX binden

Meine Frage: Ist es möglich, eine Stileigenschaft (zB "-fx-Hintergrundfarbe: blau") an einen Knoten zu binden?

Aus meiner Recherche sehe ich, dass dies definitiv mit Textwerten für Etiketten möglich ist (erklärt von James_D hier: JavaFX - How to use a method in a controller from another controller?), aber ich habe es schwer herauszufinden, was die Syntax für eine ähnliche Sache mit "setStyle" wäre.

Das Modell habe ich bisher:

public class Model { 

    private final StringProperty shadow = new SimpleStringProperty("-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.24), 10,0,0,0)"); 

    public StringProperty shadowProperty() { 
     return shadow; 
    } 

    public final String getShadow() { 
     return shadowProperty().get(); 
    } 

    public final void setShadow(String shadow) { 
     shadowProperty().set(shadow); 
    } 
} 

Ich verstehe, wie ich würde den „Schatten“ Wert von einer Steuerung eingestellt, aber was ich nicht verstehe, ist, wie ich einen Knoten aus einem anderen Controller binden kann auf diese Veränderung zu hören.

sagen Lassen Sie den Knoten ist so etwas wie:

@FXML AnchorPane appBar 

ich will „AppBar“ auf Änderungen im Modell „Schatten“ gemacht nehmen. Wie würde das aussehen?

+1

Können Sie ein Beispiel geben, was Sie versucht, und erklären, warum es nicht funktioniert? Im Moment ist unklar, was genau das Problem ist. – Itai

+1

Aktualisierte Frage. – Shane

Antwort

2

Sie müssen der shadowProperty einen Listener hinzufügen, um ihre Änderungen abhören zu können.

Ich bin mir nicht ganz sicher, was Sie erreichen möchten, aber das sollte Ihre Frage darüber beantworten, wie man Änderungen an Eigentum zu hören.

PS: im auf Handy, so dass keine Garantien in Bezug auf Tippfehler

Edit: Sie können auch die Eigenschaft eines Objekts auf die Eigenschaft eines anderen binden. Verwenden Sie dazu bind().

EDIT: Hier ein Beispiel:

import javafx.application.Application; 
import javafx.beans.property.Property; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.scene.Scene; 
import javafx.scene.layout.Background; 
import javafx.scene.layout.BackgroundFill; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class Main extends Application { 

    Property<Background> backgroundProperty; 
    StringProperty styleProperty; 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     VBox root = new VBox(10); 

     backgroundProperty = new SimpleObjectProperty<>(); 
     styleProperty = new SimpleStringProperty(); 

     // Pane that changes background by listener 
     Pane pane1 = new Pane(); 
     pane1.setMinHeight(40); 
     backgroundProperty.addListener((observable, oldValue, newValue) -> { 
      pane1.setBackground(backgroundProperty.getValue()); 
     }); 

     // Pane that changes background by property binding 
     Pane pane2 = new Pane(); 
     pane2.setMinHeight(40); 
     pane2.backgroundProperty().bind(backgroundProperty); 

     // Pane that binds the style property 
     Pane pane3 = new Pane(); 
     pane3.setMinHeight(40); 
     pane3.styleProperty().bind(styleProperty); 

     backgroundProperty.setValue(new Background(new BackgroundFill(Color.RED, null, null))); 
     styleProperty.setValue("-fx-background-color: black"); 

     root.getChildren().add(pane1); 
     root.getChildren().add(pane2); 
     root.getChildren().add(pane3); 

     Scene scene = new Scene(root, 200, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 
} 
+0

Danke für die Antwort. Meine Frage ist ... wie würde eine CSS-Eigenschaft eines Knotens binden? "-fx-Hintergrundfarbe" zum Beispiel. – Shane

+0

hinzugefügt ein Beispiel – JohnRW

+0

Sie könnten natürlich auch eine String-Eigenschaft verwenden, hören Sie das und ändern Sie den Stil, indem Sie den neuen CSS-Stil im Listener – JohnRW