在按钮单击或输入键上发送文本字段输入

Sending Textfield input on ButtonClick or Enter Key

我正在尝试进行聊天,这样当我按回车键或按 'Send' 按钮时,文本字段的输入将进入 ListView。它完成了它的工作,尽管代码真的很乱。

我的控制器代码如下:

public void initialize() {
        sendButton.setDisable(true);

}

public void isChatEmpty() {
    boolean isChatEmpty = textInput.getText().isEmpty();
    sendButton.setDisable(isChatEmpty);
}
public void sendMessageOnClick(){
    sendButton.setOnAction((e) -> {
        String message = textInput.getText();
        chatHistory.getItems().add("Sorin: " + message + "\n");
        textInput.setText(null);
        sendButton.setDisable(true);
    });
}
public void sendMessageOnEnter(){
    textInput.setOnKeyPressed(e -> {
        if (e.getCode() == KeyCode.ENTER) {
            String message = textInput.getText();
            chatHistory.getItems().add("Sorin: " + message + "\n");
            textInput.setText(null);
            sendButton.setDisable(true);
            System.out.print("test");
        }
    });
}

我知道它有效,因为我可以在 GUI 中看到它,但不知何故,我在 'isChatEmpty' 上得到了一个 Nullpointer,老实说,我不知道为什么。

Caused by: java.lang.NullPointerException
    at sample.Controller.isChatEmpty(Controller.java:29)

另外,有没有办法结合这两个 Lambdas 函数?

提前致谢!

isChatEmpty() 方法中,textInput.getText() 的结果是 null,因为您用 textInput.setText(null); 设置了它。 null 会导致 NPE(请参阅 String.isEmpty() 的文档)。

要解决此问题,您可以删除 isChatEmpty() 方法并设置单向绑定:

public void initialize() {
    sendButton.disableProperty().bind(textInput.textProperty().isEmpty());
}

注意这里的 .isEmpty() 不是调用 String.isEmpty() 而是调用 StringExpression.isEmpty() 什么生成 BooleanBinding.

类型的绑定

在输入和单击的情况下,有一种简单的方法可以解决这个问题:对两者都使用 onAction 方法。对于 TextField,当您按回车键时会触发此操作。此外,这些处理程序应该从 fxml 分配。也可以使用绑定来禁用按钮:

<TextField fx:id="textInput" onAction="#send"/>
<Button fx:id="sendButton" text="Send" onAction="#send"/>
@FXML
private void initialize() {
    sendButton.disableProperty().bind(textInput.textProperty().isEmpty());
}

@FXML
private void send() {
    String message = textInput.getText();
    if (message != null && !message.isEmpty()) {
        chatHistory.getItems().add("Sorin: " + message);
        textInput.clear();
    }
}