2013-10-17 137 views
3

我在寫一個簡單的程序,將ChoiceBox的值綁定到Label節點的字體值。但是,我無法做到這一點。JavaFX綁定簡單示例

的應用

package mybinding; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.SceneBuilder; 
import javafx.scene.control.ChoiceBox; 
import javafx.scene.control.ChoiceBoxBuilder; 
import javafx.scene.control.Label; 
import javafx.scene.control.LabelBuilder; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.GridPaneBuilder; 
import javafx.stage.Stage; 

public class SimpleBindingMain extends Application{ 

    Label simpleLabel; 
    ChoiceBox availableFonts; 
    GridPane gridPane; 
    SimpleBindingModel model = new SimpleBindingModel(); 
    Scene scene; 

    @Override 
    public void start(Stage stage) throws Exception { 
     availableFonts = ChoiceBoxBuilder 
         .create() 
         .items(model.fonts) 
         .build(); 
     simpleLabel = LabelBuilder 
        .create() 
        .text("Font Preview") 
        .font(model.theFont) 
        .build(); 

     gridPane = GridPaneBuilder.create().build(); 
     gridPane.add(simpleLabel,0,0); 
     gridPane.add(availableFonts,0,1); 

     model.fontSelectionModel = availableFonts.getSelectionModel(); 
     model.addFontSelectionListener(); 

     scene = SceneBuilder 
       .create() 
       .root(gridPane) 
       .build(); 

     /** 
     * ADD BINDING CODE 
     */ 

     stage.setScene(scene); 
     stage.sizeToScene(); 
     stage.show(); 

    } 

    public static void main(String[] args) { 
     Application.launch("mybinding.SimpleBindingMain"); 
    } 
} 

示範

package mybinding; 

import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.control.SingleSelectionModel; 
import javafx.scene.text.Font; 

public class SimpleBindingModel { 
    public StringProperty string = new SimpleStringProperty(); // the actual text 
    public IntegerProperty textSize = new SimpleIntegerProperty(); // the size of the text 
    public ObservableList fonts = FXCollections.observableArrayList(// possible fonts 
       "DejaVu Sans Mono", 
       "Nimbus Sans L", 
       "Ubuntu", 
       "Ubuntu Condensed" 
      ); 
    public Font theFont = Font.font("DejaVu Sans Mono",18); // default font 
    public SingleSelectionModel fontSelectionModel; 


    public void addFontSelectionListener(){ 
     fontSelectionModel.selectedIndexProperty().addListener(new ChangeListener(){ 
      @Override 
      public void changed(ObservableValue value, Object oldValue, Object newValue) { 
       int selectedFontIndex = fontSelectionModel.selectedIndexProperty().getValue(); 
       theFont = Font.font((String)fonts.get(selectedFontIndex),12); 
      } 
     }); 
    } 
} 

請幫助我的綁定代碼。

回答

4

你幾乎在那裏:-)。只需稍作修改即可。

首先,將SimpleBindingModel.theFont屬性類型更改爲ObjectProperty<Font>,允許將SimpleBindingMain.simpleLabel.fontProperty綁定到它。

在這種情況下,財產申報是:

public ObjectProperty<Font> theFont = new SimpleObjectProperty<Font>(Font.font("DejaVu Sans Mono",18)); 

之後,您需要更改其中theFont讀/套點。例如,在字體選擇監聽器:

public void addFontSelectionListener(){ 
    fontSelectionModel.selectedIndexProperty().addListener(new ChangeListener(){ 
     @Override 
     public void changed(ObservableValue value, Object oldValue, Object newValue) { 
      int selectedFontIndex = fontSelectionModel.selectedIndexProperty().getValue(); 
      // old code: theFont = Font.font((String)fonts.get(selectedFontIndex),12); 
      theFont.set(Font.font((String)fonts.get(selectedFontIndex),12)); 
     } 
    }); 
} 

最後,你可以綁定simpleLabel.fontPropertytheFont

simpleLabel.fontProperty().bind(model.theFont);