2017-10-21 13 views
0

J'ai un Label et un ProgressBar dans un GridPane. J'ai enregistré un gestionnaire d'événement onMouseClicked sur le GridPane. Si je clique sur l'étiquette, le gestionnaire est déclenché. Si je clique sur ProgressBar, le gestionnaire ne se déclenche pas. Pourquoi? Comment puis-je le réparer?ProgressBar et événement cliqué de la souris

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

Le gestionnaire est évoqué si vous cliquez n'importe où _but_ le 'ProgressBar'. Je ne sais pas pourquoi. Cela fonctionne partout si vous ajoutez le même gestionnaire directement à 'ProgressBar'. – trashgod

Répondre

0

Il semblerait que le MouseEvent soit consommé. J'ai jeté un rapide coup d'oeil à travers la classe ProgressBar et il semblerait que le ProgressIndicatorSkinBehaviourBase puisse provoquer la consommation de l'événement.

Une solution rapide et sale serait de mettre la souris cliquée EventHandler pour la ProgressBar de re-feu l'événement au GridPane:

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

ou de travailler avec un nœud Parent:

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

ou la sous-classe ProgressBar pour appliquer automatiquement ce comportement:

public class NoConsumeProgressBar extends ProgressBar { 

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