Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaFX: How to make enter key submit TextArea

Tags:

java

chat

javafx

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

//...
like image 970
Bassinator Avatar asked Aug 11 '14 21:08

Bassinator


3 Answers

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.

like image 60
Ryan J Avatar answered Nov 11 '22 20:11

Ryan J


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();
            }
        }
    }
});
like image 43
just_some_guy Avatar answered Nov 11 '22 21:11

just_some_guy


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
   }
}); 
like image 10
Mr_Lucky Avatar answered Nov 11 '22 20:11

Mr_Lucky