对不起,如果这看起来有点太简单了,我是JavaFX的新手,这是我用它构建的第一个小应用程序。
我正在努力建立一个简单的聊天客户端。我正在使用JavaFX Scene构建器来创建客户端UI,以及连接到FXML的控制器类。
如何才能将文本区域中的当前文本提交给服务器,并在按下回车键时清除文本区域,而不是使用某种“发送”按钮?
编辑:这是不起作用的代码:
//...
public class FXMLDocumentController
{
//...
@FXML private TextArea messageBox;
//...
messageBox.setOnKeyPressed(new EventHandler<KeyEvent>()
{
@Override
public void handle(KeyEvent keyEvent)
{
if(keyEvent.getCode() == KeyCode.ENTER)
{
//sendMessage();
}
}
});
//...
答案 0 :(得分:10)
这可以让你得到你想要的东西:
TextArea area;
//... (initialize all your JavaFX objects here...)
// wherever you assign event handlers...
area.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
if (keyEvent.getCode() == KeyCode.ENTER) {
String text = area.getText();
// do your thing...
// clear text
area.setText("");
}
}
});
我可以补充一点,如果您倾向于提供两个按钮和回车键事件,您可以将两个控件的事件处理函数绑定到单个公共函数中,如此这样:
Button sendButton;
TextArea area;
// init...
// set handlers
sendButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
sendFunction();
}
});
area.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
if (keyEvent.getCode() == KeyCode.ENTER) {
sendFunction();
}
}
});
// define send function
public void sendFunction() {
String text = this.area.getText();
// do the send stuff
// clear text (you may or may not want to do this here)
this.area.setText("");
}
无论哪种方式都有效,祝你好运。
答案 1 :(得分:8)
你也可以使用lambda表达式......我认为它更优雅,更简单
textArea.setOnKeyPressed(event -> {
if(event.getCode() == KeyCode.ENTER){
//type here what you want
}
});
答案 2 :(得分:1)
除了其他答案之外,我认为如果用户按下SHIFT + ENTER,在某些应用程序中可能不会实际调用send函数。在那种情况下,他/她可能真的想要一条新线。
textArea.setOnKeyPressed(event -> {
if (event.getCode() == KeyCode.ENTER) {
event.consume(); // otherwise a new line will be added to the textArea after the sendFunction() call
if (event.isShiftDown()) {
textArea.appendText(System.getProperty("line.separator"));
} else {
sendFunction();
}
}
});
如果您不想发送空消息,可以执行以下操作:
textArea.setOnKeyPressed(event -> {
if (event.getCode() == KeyCode.ENTER) {
event.consume();
if (event.isShiftDown()) {
textArea.appendText(System.getProperty("line.separator"));
} else {
if(!textArea.getText().isEmpty()){
sendFunction();
}
}
}
});