CheckBox 的框和标签的不同事件?(JavaFX)

Different events for CheckBox's box and label?(JavaFX)

我希望我的 CheckBox 只有在单击框时才被选中。如果单击 CheckBox 的标签,我想在未选择此 CheckBox 的情况下执行不同的操作。这怎么可能实现?

我制作了单独的复选框和标签。但是我无法通过复选框更改标签的伪class。他们都在列表视图中。这是代码的一部分:

HBox todoHBox=new HBox(0);
CheckBox todoCheckBox=new CheckBox();
Label todoLabel=new Label(item.getName());
Label timeLabel=new Label();
Region rSpring = new Region(); 
todoHBox.setPrefWidth(300);
todoHBox.setHgrow(rSpring, Priority.ALWAYS);
todoHBox.setHgrow(timeLabel, Priority.ALWAYS);
todoHBox.setHgrow(todoCheckBox, Priority.NEVER);
timeLabel.setMinWidth(60);
timeLabel.getStyleClass().add("time-label");
todoLabel.getStyleClass().add("todo-label");
todoHBox.getChildren().addAll(todoCheckBox,todoLabel,rSpring,timeLabel);
todoHBox.setMargin(timeLabel, new Insets(3,0,0,0));
PseudoClass pseudo = PseudoClass.getPseudoClass("task-done");
todoCheckBox.selectedProperty().addListener(e->{
if(todoCheckBox.isSelected()){
       todoLabel.pseudoClassStateChanged(pseudo, true);
       }else{
             todoLabel.pseudoClassStateChanged(pseudo, false);
              }});
             setGraphic(todoHBox);

只需使用两个控件:一个没有文本的 CheckBox 和一个 Label。在 Label 上调用 setOnMouseClicked(...),使用一个可以满足您需要的处理程序。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class CheckBoxWithLabelExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        CheckBox checkBox = new CheckBox();
        checkBox.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> 
            System.out.println("Check box is now "+(wasSelected ? "not ":"") + "selected"));
        Label label = new Label("Make Task");
        label.setOnMouseClicked(e -> System.out.println("Text clicked"));
        HBox control = new HBox(checkBox, label);

        Scene scene = new Scene(new StackPane(control), 350, 75);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}