我正在尝试进行聊天,以便当我按回车键或按"发送"按钮时,文本字段的输入将进入列表视图。它确实是它的工作,尽管代码真的很混乱。
我的控制器代码如下:
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"上得到了一个 Null指针,公平地说,我不知道为什么。
Caused by: java.lang.NullPointerException
at sample.Controller.isChatEmpty(Controller.java:29)
另外,有没有办法组合两个 Lambda 函数?
提前谢谢你!
在输入并单击的情况下,有一种简单的方法可以解决这个问题:对两者都使用 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();
}
}
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
绑定的内容。