JavaFX:如何使enter键提交TextArea

时间:2014-08-11 21:15:50

标签: java javafx chat

对不起,如果这看起来有点太简单了,我是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();
        }
    }
});

//...

3 个答案:

答案 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();
            }
        }
    }
});