首页 文章

JavaFX:如何使回车键提交TextArea

提问于
浏览
6

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

//...

3 回答

  • 9

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

    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

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

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

    除了其他答案之外,我认为如果用户按下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();
                }
            }
        }
    });
    

相关问题