2017-03-16 10 views
0

コードにJavaFX TextFieldがあり、TextFieldのさまざまなイベントにアクションを追加したいと考えています。私は、TextFieldにテキストを書いた後Enterキーを押すとjavafxのテキストフィールドのonAction

import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.event.EventType; 
import javafx.geometry.Pos; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.control.Tooltip; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.*;  
import javafx.scene.text.Font; 
import javafx.stage.FileChooser; 
import javafx.stage.Stage; 
import java.io.File; 
import javafx.beans.value.ChangeListener; 

/* Input from user */ 
    weightTF = new TextField(); 
    weightTF.setMaxWidth(36); 
    activeInsulinTF = new TextField(); 
    activeInsulinTF.setMaxWidth(36); 
    VBox inputBox = new VBox(); 
    inputBox.setFillWidth(false); 
    inputBox.setAlignment(Pos.CENTER); 
    inputBox.getChildren().add(weightTF); 
    inputBox.getChildren().add(activeInsulinTF); 
    inputBox.setSpacing(8); 
    // Add onAction for the texfields 
    menuHBox.getChildren().add(inputBox); 
     weightTF.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent e) { 
      double weight = Double.parseDouble(weightTF.getText()); 
      Main.state.setWeight(weight); 
      System.out.println("Entered weight: " + weight); 
     } 
    }); 

今日、私は唯一のアクションを取得します。タブプレスを操作するためのアクションを追加するにはどうすればよいですか?また、マウスクリックでTextFieldがフォーカスを失ったときの対応方法は?

私はドキュメントを読んで、それは可能なはずです:誰かが私を助けることができる https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TextField.html

希望:)

答えて

0

まさにそれを行うための便利なメソッドのカップルが一例

weightTF.setOnKeyPressed(new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     // do stuff 
    } 
}); 
のために、あります

これは、TextFieldでキーが押されるたびに実行されます。押されたキーが特定のキーであるかどうかを確認することができます。これは、例えば、

if(event.getCode() == KeyCode.TAB){ 
    // do stuff 
} 

によって達成することができる。 NetBeansやその他のIDEを使用している場合は、「weightTF。」と入力した後でオートコンプリートショートカットを押すと、便利なメソッドが表示されます。私が話しているメソッドは、setOnから始まります。 役に立ったと思っていますか?

+0

ありがとうございます!タブ用のコードがうまくいき、マウスのためにそれを解決する正しい方向に私を得ました:)。だから今それはすべて動作します。 – Hanna

+0

@ハナ私はあなたの質問から、あなたが別のコントロールにフォーカスを移動するユーザーに応答する必要があると思っています。このような「低レベル」のイベントを使用することは、それを実行するための非常に堅牢な方法ではありません。代わりに、テキストフィールドの 'focusedProperty'でリスナーを登録する必要があります。 –

1

ユーザーがフォーカスをテキストフィールドから別のコントロールに移動したときに本当に興味があるように聞こえます。これは通常、ユーザーがTabを押すか、別のコントロールでマウスをクリックすると起こりますが、技術的にはこの動作はプラットフォームによって異なります。これはプログラム的にも起こる可能性があります。

「低レベル」のイベントハンドラを使用する際の問題点は、(1)理論的には、マウスリスナーをと登録する必要があります。他のコントロール。 (2)フォーカストラバーサルのためにすべてのプラットフォームで同じキーストロークが使用されていること。 (3)プログラムによるフォーカストラバーサルが必要な機能(つまり、someOtherControl.requestFocus()などのコードがある)を追加すると、イベントリスナーには通知されません。

テキストフィールドがフォーカスを失った場合対応するための確実な方法は、そのfocusedProperty()でリスナを登録するだけです。また、

weightTF.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> { 
    if (! isNowFocused) { 
     // text field has lost focus... 
     System.out.println(weightTF.getText()); 
    } 
}); 

Sceneも同様に観測可能であると含まれていfocusOwnerPropertyを、持っていること現在フォーカスを持っているシーン内のノードへの参照。テキストフィールドからフォーカスを離して移動する、より一般的なリスナーではなく、このプロパティを代わりに使用できます。

関連する問題