确定JavaFX中的调用节点更改侦听器
发布时间:2020-12-15 00:49:54 所属栏目:Java 来源:网络整理
导读:我需要在更改文本时对多个TextField执行验证.验证完全相同,所以我认为我使用一个程序.我不能使用onInputMethodTextChanged,因为即使控件没有焦点我也需要执行验证.所以我在textProperty中添加了一个ChangeListener. private TextField firstTextField;privat
我需要在更改文本时对多个TextField执行验证.验证完全相同,所以我认为我使用一个程序.我不能使用onInputMethodTextChanged,因为即使控件没有焦点我也需要执行验证.所以我在textProperty中添加了一个ChangeListener.
private TextField firstTextField; private TextField secondTextField; private TextField thirdTextField; protected void initialize() { ChangeListener<String> textListener = new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> observable,String oldValue,String newValue) { // Do validation } }; this.firstTextField.textProperty().addListener(textListener); this.secondTextField.textProperty().addListener(textListener); this.thirdTextField.textProperty().addListener(textListener); } 但是,在执行验证时,无法知道哪个TextField触发了更改.我如何获得这些信息? 解决方法
有两种方法:
假设您只使用TextField的text属性注册此侦听器,则传递给changed(…)方法的ObservableValue是对该textProperty的引用.它有一个getBean()方法,它将返回TextField.所以你可以做到 StringProperty textProperty = (StringProperty) observable ; TextField textField = (TextField) textProperty.getBean(); 如果您使用TextField的textProperty之外的其他内容注册侦听器,这显然会中断(使用ClassCastException),但它允许您重用相同的侦听器实例. 更健壮的方法可能是将侦听器类创建为内部类而不是匿名类,并保留对TextField的引用: private class TextFieldListener implements ChangeListener<String> { private final TextField textField ; TextFieldListener(TextField textField) { this.textField = textField ; } @Override public void changed(ObservableValue<? extends String> observable,String newValue) { // do validation on textField } } 然后 this.firstTextField.textProperty().addListener(new TextFieldListener(this.firstTextField)); 等等 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |