JavaFX绑定简单示例

时间:2013-10-17 17:49:20

标签: javafx-2

我正在编写一个简单的程序来将ChoiceBox的值绑定到Label节点的字体值。但是,我无法做到这一点。

应用

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

请帮我解决绑定代码问题。

1 个答案:

答案 0 :(得分: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.fontProperty绑定到theFont

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