JavaFX 2绑定
问题描述:
我在绑定一个Label
textProperty时遇到问题,我希望使用双变量格式化文本。
它的工作原理(标签文本属性更新),如果我做以下,但这样我不能格式化文本我想如何。
JavaFX 2绑定
label.textProperty().bind(model.doubleProperty().asString());
它不工作(不更新标签文本属性)的方式:
StringBinding labelBinding = new StringBinding() {
{
bind(model.doubleProperty().asString());
}
@Override
protected String computeValue() {
if(model.getDouble() <= 0) {
return "---";
} else {
return df1.format(model.getDouble());
}
}
};
label.textProperty().bind(labelBinding);
感谢您的帮助。
答
我发现如何使它工作,我真的不明白它是如何工作的。
StringBinding labelBinding = new StringBinding() {
{
bind(model.doubleProperty()); // don't call asString() here
}
@Override
protected String computeValue() {
if(model.getDouble() <= 0) {
return "---";
} else {
return df1.format(model.getDouble());
}
}
};
label.textProperty().bind(labelBinding);
但是这给编译错误
label.textProperty().bind(model.doubleProperty());
答
假设你有下面的 “JavaFX的豆”:
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class Employee {
private final StringProperty lastname = new SimpleStringProperty();
private final StringProperty firstname = new SimpleStringProperty();
private final DoubleProperty salary = new SimpleDoubleProperty();
/**
* @return the lastname Property
*/
public StringProperty lastnameProperty() {
return lastname;
}
/**
* @return the lastname String
*/
public String getLastname() {
return lastname.get();
}
/**
* @param lastname the lastname to set
*/
public void setLastname(final String lastname) {
this.lastname.set(lastname);
}
/**
* @return the firstname property
*/
public StringProperty firstnameProperty() {
return firstname;
}
/**
* @return the firstname String
*/
public String getFirstname() {
return firstname.get();
}
/**
* @param firstname the firstname to set
*/
public void setFirstname(final String firstname) {
this.firstname.set(firstname);
}
/**
* @return the salary Property
*/
public DoubleProperty salaryProperty() {
return salary;
}
/**
* @return the salary double
*/
public double getSalary() {
return salary.get();
}
/**
* @param salary the salary to set
*/
public void setSalary(final double salary) {
this.salary.set(salary);
}
}
现在,在开始 - 定义标签你的应用方法:
Label labaelSalary = new Label();
,并与“JavaFX的豆”的salaryProperty其绑定:
labaelSalary.textProperty()
.bind(emp.salaryProperty().asString("%.2f"));
添加一个按钮,并设置此按钮的动作:
Button changeSalaryButton = new Button("Change Salary");
changeSalaryButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent event) {
double salary = Math.random() * 10000;
emp.setSalary(salary);
}
});
每次单击该按钮, Employee对象emp的工资是随机设置的。 labelSalary的有界文本(属性)立即更改为emp Employee对象的salary属性的新值。 下面是启动方法的代码:
@覆盖
public void start(final Stage primaryStage) {
Employee emp = new Employee();
emp.setFirstname("Fred");
emp.setLastname("Las Frite");
emp.setSalary(12.500);
Label labelSalary = new Label();
labelSalary.textProperty()
.bind(emp.salaryProperty().asString("%.2f"));
Button changeSalaryButton = new Button("OK");
changeSalaryButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent event) {
double salary = Math.random() * 10000;
emp.setSalary(salary);
}
});
HBox hBox = new HBox(10, labelSalary, changeSalaryButton);
hBox.setPadding(new Insets(20));
hBox.setAlignment(Pos.CENTER);
primaryStage.setScene(new Scene(hBox));
primaryStage.setWidth(400);
primaryStage.setHeight(600);
primaryStage.show();
}
调用'asString()'在第二种情况下 –
,如果你解决你的答案鉴于@Grinev,并将它标志的评论将是巨大的作为答案。 TIA – lkuty