当用户点击文本字段时可能的EventHandler?

时间:2018-03-16 01:21:48

标签: java javafx

所以,使用代码时:

textField.setOnAction();

它只能用Enter键运行,但我只是想知道TextField和TextArea是否有某种类型的EventHandler可以在用户点击或另一个TextField时将其字段中的文本保存到对象的实例变量中?例如:

textField.setOnMouse(e -> 
{
object.setText(textField.)
});

一旦用户点击TextField,此代码就会将信息保存在其字段中。

2 个答案:

答案 0 :(得分:3)

你可以回应它失去焦点:

textField.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
    if (! isNowFocused) {
        // do whatever you need
    }
});

答案 1 :(得分:1)

假设所需的提交(又名:保存模型/数据对象的用户输入)语义为

  • 提交动作:通常由ENTER触发(在TextField上可用,但在TextArea上不可用)
  • commit-on-focusLost:当焦点从输入控件转移到其他地方时触发,可以通过鼠标或制表符f.i发生。

他们不是:

  • 提交更改:只要输入控件的textProperty发生更改,就会更新数据

建议的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;
}