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());  
+0

调用'asString()'在第二种情况下 –

+0

,如果你解决你的答案鉴于@Grinev,并将它标志的评论将是巨大的作为答案。 TIA – lkuty

假设你有下面的 “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(); 
}