web-dev-qa-db-ja.com

JavaFX:Enterキーを送信する方法TextArea

これが少し簡単すぎると思われる場合は申し訳ありませんが、私はJavaFXを初めて使用します。これは、JavaFXを使用して構築された最初の小さなアプリです。

必要最低限​​のチャットクライアントを作成しようとしています。 JavaFX Scene Builderを使用してクライアントUIを作成し、コントローラークラスをFXMLに接続しています。

ある種の「送信」ボタンを使用する代わりに、テキスト領域内の現在のテキストがサーバーに送信され、Enterキーを押すとテキスト領域がクリアされるようにするにはどうすればよいですか?

編集:これが機能していないコードです:

//...

public class FXMLDocumentController
{

//...

@FXML private TextArea messageBox;

//...

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

//...
8
Bassinator

これはあなたが望むものを手に入れるはずです:

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

追加するかもしれませんが、両方ボタンとEnterキーイベントを提供する傾向がある場合は、次のような方法で、両方のコントロールのイベントハンドラー関数を単一の共通関数に関連付けることができます。

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

どちらの方法でもうまくいきます、頑張ってください。

12
Ryan J

ラムダ式も使用できます...よりエレガントでシンプルだと思います

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

他の回答に加えて、ユーザーがSHIFT + ENTERを押した場合に、実際に送信機能を呼び出さないことが、一部のアプリケーションで役立つ場合があると思います。その場合、彼/彼女はおそらく実際に新しい行を望んでいました。

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();
            }
        }
    }
});
2
just some guy