ProgressBar和鼠标单击事件

时间:2017-10-21 14:55:16

标签: java javafx javafx-8

我在GridPane中有一个Label和一个ProgressBar。 我在GridPane上注册了一个onMouseClicked事件处理程序。 如果我单击Label,则会触发处理程序。 如果我点击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);
    }

}

1 个答案:

答案 0 :(得分:0)

似乎正在消耗row。我快速查看了UI课程,UITableViewDataSource MouseEvent似乎可能导致该事件被消耗。

快速而肮脏的解决方案是为ProgressBar设置鼠标点击ProgressIndicatorSkin,以便将事件重新触发到BehaviourBase

EventHandler

或与任何ProgressBar节点一起使用:

GridPane

或子类progressBar.setOnMouseClicked(e -> gridPane.fireEvent(e)); 自动应用此行为:

Parent