所以,使用代码时:
textField.setOnAction();
它只能用Enter键运行,但我只是想知道TextField和TextArea是否有某种类型的EventHandler可以在用户点击或另一个TextField时将其字段中的文本保存到对象的实例变量中?例如:
textField.setOnMouse(e ->
{
object.setText(textField.)
});
一旦用户点击TextField,此代码就会将信息保存在其字段中。
答案 0 :(得分:3)
你可以回应它失去焦点:
textField.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
if (! isNowFocused) {
// do whatever you need
}
});
答案 1 :(得分:1)
假设所需的提交(又名:保存模型/数据对象的用户输入)语义为
他们不是:
建议的approach by James是还在与操作处理程序执行相同作业的控件上注册focusListener:
// in actionHandler
textField.setOnAction(e -> myData.setText(textField.getText()));
// in listener when receiving a focusLost
textField.focusedProperty().addListener((... ) -> myData.setText(textField.getText()))
完全有效!
只是指向另一种选择:FX支持实现一体化,而这是一个TextFormatter。它保证在commit-on-action和commit-on-focusLost上更新它的值,但不能在键入时更新。因此,我们可以将数据属性(双向地,如果需要)绑定到格式化程序的值,并自然地具有所需的提交语义。
演示其用法的代码段(标签只是数据的替身):
private Parent createTextContent() {
TextFormatter<String> fieldFormatter = new TextFormatter<>(
TextFormatter.IDENTITY_STRING_CONVERTER, "textField ...");
TextField field = new TextField();
field.setTextFormatter(fieldFormatter);
Label fieldValue = new Label();
fieldValue.textProperty().bind(fieldFormatter.valueProperty());
TextFormatter<String> areaFormatter = new TextFormatter<>(
TextFormatter.IDENTITY_STRING_CONVERTER, "textArea ...");
TextArea area = new TextArea();
area.setTextFormatter(areaFormatter);
Label areaValue = new Label();
areaValue.textProperty().bind(areaFormatter.valueProperty());
HBox fields = new HBox(100, field, fieldValue);
BorderPane content = new BorderPane(area);
content.setTop(fields);
content.setBottom(areaValue);
return content;
}