繁体   English   中英

ProgressBar和鼠标单击事件

[英]ProgressBar and mouse clicked event

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

}

看来MouseEvent已被消耗。 我快速浏览了ProgressBar类,似乎ProgressIndicatorSkinBehaviourBase可能导致事件被消耗。

一种快速而肮脏的解决方案是将鼠标单击的EventHandler设置为ProgressBar以将事件重新激发到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);
            }
        });
    }    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM