2017-10-21 5 views
0

私はGridPaneにLabelとProgressBarを持っています。 私は、GridPaneにonMouseClickedイベントハンドラを登録しました。 ラベルをクリックすると、ハンドラがトリガされます。 ProgressBarをクリックすると、ハンドラがトリガされません。 なぜですか?どうすれば修正できますか?ProgressBarとマウスのクリックイベント

package test; 

import javafx.application.Application; 
import javafx.scene.Cursor; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.ProgressBar; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.RowConstraints; 
import javafx.stage.Stage; 


public class ProgressBarTestApplication extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     GridPane gridPane = new GridPane(); 
     ColumnConstraints columnConstraints0 = new ColumnConstraints(); 
     columnConstraints0.setHgrow(Priority.SOMETIMES); 
     ColumnConstraints columnConstraints1 = new ColumnConstraints(); 
     columnConstraints1.setHgrow(Priority.NEVER); 
     gridPane.getColumnConstraints().addAll(columnConstraints0, columnConstraints1); 

     RowConstraints rowConstraints0 = new RowConstraints(); 
     rowConstraints0.setVgrow(Priority.SOMETIMES); 
     gridPane.getRowConstraints().add(rowConstraints0); 

     Label someLabel = new Label("Some Label:"); 
     ProgressBar progressBar = new ProgressBar(); 
     progressBar.setPrefWidth(250.0d); 
     someLabel.setLabelFor(progressBar); 
     gridPane.add(someLabel, 0, 0); 
     gridPane.add(progressBar, 1, 0); 
     gridPane.setCursor(Cursor.HAND); 
     gridPane.setHgap(5.0d); 
     gridPane.setOnMouseClicked(event -> System.out.println("Clicked!")); 

     Scene scene = new Scene(gridPane, 350, 150); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

} 
+0

ハンドラは、「ProgressBar」のどこかをクリックすると呼び出されます。どうしてか分かりません。 'ProgressBar'に同じハンドラを直接追加するとどこでも動作します。 – trashgod

答えて

0

MouseEventが消費されているようです。私はProgressBarクラスをすばやく見て、ProgressIndicatorSkinBehaviourBaseがイベントを消費させているように見えます。迅速かつ汚いソリューションは、マウスを設定することです

GridPaneProgressBar再発射するイベントにするためにEventHandlerをクリック:

progressBar.setOnMouseClicked(e -> gridPane.fireEvent(e)); 

または任意のParentノードで動作するように:

progressBar.setOnMouseClicked(e -> progressBar.getParent().fireEvent(e)); 

またはサブクラスProgressBarを使用すると、この動作が自動的に適用されます。

public class NoConsumeProgressBar extends ProgressBar { 

    public NoConsumeProgressBar() { 
     setOnMouseClicked(e -> { 
      Parent parent = getParent(); 
      if (parent != null) { 
       parent.fireEvent(e); 
      } 
     }); 
    }  
}