我正在编写一个简单的程序来将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);
}
});
}
}
请帮我解决绑定代码问题。
答案 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);