简体   繁体   中英

JavaFX: How to make enter key submit TextArea

Sorry if this seems a little too easy, I'm brand new to JavaFX, this is my first little app built with it.

I am trying to make a bare bones chat client. I am using the JavaFX Scene builder to make the client UI, and a controller class connected to the FXML.

How can I make is so that the current text of in the text area is submitted to the server and the text area is cleared upon the enter key press, instead of using some kind of "send" button?

EDIT: Here is the code that is not working:

//...

public class FXMLDocumentController
{

//...

@FXML private TextArea messageBox;

//...

messageBox.setOnKeyPressed(new EventHandler<KeyEvent>() 
{
    @Override
    public void handle(KeyEvent keyEvent) 
    {
        if(keyEvent.getCode() == KeyCode.ENTER)
        {
            //sendMessage();
        }
    }
});

//...

This should get you what you want:

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

I might add, that if you are so inclined to provide both a button and an enter key event, you could tie the event handler functions of both controls to a single common function in a way such as this:

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

Either way works, good luck.

You can use lambda expressions also ... I think it is more elegant and simply

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

In addition to the other answers, I think it might be useful in some applications to not actually invoke the send function if the user pressed SHIFT+ENTER. In that case he/she maybe actually wanted a new line.

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

If you don't want to send empty messages you can do something like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM