3

我正在编写一个简单的程序来将 a 的值绑定到节点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);
            }
        });
    }
}  

请帮我解决绑定代码。

4

1 回答 1

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);
于 2013-10-18T11:48:16.697 回答