JavaFX:如何使enter键提交TextArea

Bas*_*tor 9 java chat javafx

对不起,如果这看起来有点太容易了,我是JavaFX的新手,这是我用它构建的第一个小应用程序.

我正在尝试制作一个简单的聊天客户端.我正在使用JavaFX场景构建器来创建客户端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();
        }
    }
});

//...
Run Code Online (Sandbox Code Playgroud)

Rya*_*n J 12

这应该可以满足您的需求:

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("");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

我想补充的是,如果你愿意的话,提供两个按钮和输入键时,你可以把两个控件的事件处理函数,以一个共同的功能,在某种程度上像这样:

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("");
}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式都有效,祝你好运.


小智 9

你也可以使用lambda表达式...我认为它更优雅,更简单

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