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

Posted

技术标签:

【中文标题】在按钮单击或输入键上发送文本字段输入【英文标题】:Sending Textfield input on ButtonClick or Enter Key 【发布时间】:2018-09-23 04:59:37 【问题描述】:

我正在尝试进行聊天,因此当我按下回车键或按下“发送”按钮时,文本字段的输入将进入 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 函数?

提前谢谢你!

【问题讨论】:

【参考方案1】:

在输入和单击的情况下,有一个简单的方法来处理这个问题:对两者都使用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();
    

【讨论】:

【参考方案2】:

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 类型的绑定。

【讨论】:

说得好!我现在把初始化方法替换了,也把isChatEmpty()删了,但是我得到了这个Exception in Application start method java.lang.reflect.InvocationTargetException你也看看我的第二个问题吗? 我以某种方式修复了它,只是不使用textInput.setText(null),而只是使用textInput.clear(),令人惊讶的是,它使它起作用了:)

以上是关于在按钮单击或输入键上发送文本字段输入的主要内容,如果未能解决你的问题,请参考以下文章

在按钮单击时将文本添加到现有输入字段

如何在输入键上隐藏键盘

在表单中单击按钮时创建文本输入

当用户单击按钮时,将文本字符串添加到输入字段中(在光标位置)

单击按钮时输入附件视图

javascript点击按钮弹出文本框,用户可输入