在按钮单击或输入键上发送文本字段输入
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();
}
}
我正在尝试进行聊天,这样当我按回车键或按 '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();
}
}