2017-11-20 17 views
0

のためのマウスのClickedイベントでは、私は、ラベル、テキストフィールドなどのようなJavaFXの親とその子

、複数のノードで構成することができ、ヘッダ、ボディとフッタで構成されてカードを、持っていると私がする必要がありますキャッチon mouse clickedイベントは、カード自体またはその子かどうかに関わらず、クリックがカード内で発生したときに発生します。今のところ、テキストフィールドをクリックすると、イベントはトリガーされません。私が何かを入力するテキストフィールドをクリックするのであれば、上記の例のように

private StackPane newCard() { 
     //card wrapper 
     StackPane card = new StackPane(); 
     VBox cardContent = new VBox(); 

     JFXDepthManager.setDepth(card, 1); 
     //Header 
     StackPane header = new StackPane(); 

     VBox headerContent = new VBox(); 
     header.getChildren().add(headerContent); 
     Label label = new Label("Card title"); 

     //if I click this text field, event is not triggered 
     TextField groupCode = new TextField(); 

     headerContent.getChildren().addAll(label, groupCode); 

     //body 
     StackPane body = new StackPane(); 


     //footer 
     StackPane footer = new StackPane(); 


     cardContent.getChildren().addAll(header, body, footer); 
     card.getChildren().add(cardContent); 

     //event 
     card.setOnMouseClicked(event -> System.out.println("Clicked!")); 

     return card; 
    } 

は、"Clicked!"は印刷されません。

答えて

2

あなたはJavaFXのでのイベント処理の完全なメカニズムはhereに記載されている

card.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> System.out.println("Clicked!")); 

でこれを行うことができます。一言で言えば、イベントはターゲットです。この場合、マウスクリックと交差する最上位のノードです。 (直感的に言えば、ユーザーがクリックするノードです。)テキストフィールドをクリックすると、ターゲットはテキストフィールドになります。イベントディスパッチの2つのフェーズがあります:キャプチャバブリングです。取得フェーズでは、最初にイベントがルートノードに、次にルートの子ノード(ターゲットの祖先)に渡され、以下同様にターゲットに到達します。キャプチャフェーズでは、適切なノードに登録された任意のイベントフィルタが呼び出されます。イベントキャプチャが完了すると、バブリングフェーズが開始されます。バブリングフェーズでは、イベントは最初にターゲットノードに、次に親ノードに渡され、ルートノードに再び到達するまで続きます。バブリングフェーズ中に、ノードに登録されたイベントハンドラが呼び出されます。

イベント処理のどの段階でも、フィルタまたはハンドラはイベントをconsumeにすることができます。これは本質的にイベントのさらなる伝播を防止する。一部のコントロールには、特定のイベントを消費するビルトインハンドラがあります。あなたの例のテキストフィールドは1です。したがって、テキストフィールドのマウスクリックは親ノードのハンドラに伝播しません。ハンドラの代わりにイベントフィルタを登録すると、そのハンドラによってイベントが処理されます。

+0

恐縮です、ありがとうございます – nllsdfx

関連する問題