2017-10-21 193 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

如果您單擊任何地方_but_「ProgressBar」,則會觸發該處理程序。我不知道爲什麼。如果將相同的處理程序直接添加到「ProgressBar」,它可以在任何地方使用。 – trashgod

回答

0

這似乎是MouseEvent正在被消耗。我快速瀏覽了ProgressBar班,看起來ProgressIndicatorSkinBehaviourBase可能導致該事件被耗盡。

一個快速和骯髒的解決辦法是設置鼠標點擊EventHandlerProgressBar重新火災的事件到GridPane

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