JavaFX:如何使回车键提交TextArea

9
抱歉,如果这看起来有点简单,那是因为我刚接触JavaFX,这是我使用它构建的第一个小应用程序。
我正在尝试制作一个最基本的聊天客户端。我使用JavaFX Scene Builder制作客户端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();
        }
    }
});

//...
3个回答

14

这应该会给你想要的东西:

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
使用 area.getText() 获取文本,使用 area.setText(""); 清除文本。请查看我的编辑并确认是否适用于您。 - Ryan J
抱歉,我理解了。我的意思是,这似乎并不是编写事件处理程序的完整代码。我只熟悉编写动作监听器。我可以处理send()函数的细节,但我不清楚如何设置事件处理程序。我的编译器报错说:“messageBox包不存在”。 - Bassinator
1
你不是白痴,你正在学习。祝你前程似锦。 - Ryan J
你的问题在于代码(除了变量声明之外的所有内容)需要放在方法内部,而你把它放在了类级别。我的示例可能不是最好的,但可以说明你需要声明变量并将代码放在适当的位置(即全局变量,在方法中初始化)。 - Ryan J
1
是的,初始化方法将是一个好的地方,或者您可以创建自己的方法并从初始化方法中调用它。 - Ryan J
显示剩余6条评论

10

您也可以使用lambda表达式...我认为它更加优雅简洁

textArea.setOnKeyPressed(event -> {
   if(event.getCode() == KeyCode.ENTER){
     //type here what you want
   }
}); 

3
除了其他答案之外,我认为在某些应用程序中,如果用户按下SHIFT+ENTER,则不实际调用发送功能可能会很有用。在这种情况下,他/她可能真的想要一个新行。
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();
            }
        }
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接