Javafx-一组控件的活动处理程序



i当前具有复选框控件的数组列表。我试图捕获用户检查或取消选中框的任何时间。但是,如果不为每个复选框编写一个单独的处理程序,我无法弄清楚该怎么做,这确实是不可行的。

我已经查看了其他答案,但是他们都看到了特定项目的特定答案。有人可以直接将我指向如何捕获整个控件的事件吗?

最终目标:确定选中(或未选中)的句柄()方法中的哪个复选框。

感谢您的帮助,因为我是新编码员!

尝试将EventHandler用于所有复选框列表。

EventHandler evChb = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {  
        if (event.getSource() instanceof CheckBox) {
            CheckBox chb = (CheckBox) event.getSource();
            chb.setSelected(!chb.isSelected());
        }
    }
};

并添加动作上面创建的事件。

for(CheckBox ch: list) {
   ch.setOnAction(ecChb);
}

最简单的方法是为每个复选框创建一个不同的处理程序:

import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class LotsOfCheckBoxes extends Application {
    @Override
    public void start(Stage primaryStage) {
        List<CheckBox> checkBoxes = new ArrayList<>();
        int numBoxes = 20 ;
        VBox container = new VBox(5);
        for (int i = 1 ; i <= numBoxes ; i++) {
            checkBoxes.add(new CheckBox("Check box "+i));
        }
        container.getChildren().addAll(checkBoxes);
        for (CheckBox cb : checkBoxes) {
            cb.setOnAction(event -> handleCheckBox(cb));
        }
        Scene scene = new Scene(new ScrollPane(container), 200, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private void handleCheckBox(CheckBox cb) {
        System.out.println(cb.getText() + (cb.isSelected() ? " selected" : " deselected"));
    }
    public static void main(String[] args) {
        launch(args);
    }
}

如果您真的想在所有复选框中使用同一处理程序,则可以使用Event.getSource()获取事件的来源,但最终会得到一些丑陋的降落:

import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class LotsOfCheckBoxes extends Application {
    @Override
    public void start(Stage primaryStage) {
        List<CheckBox> checkBoxes = new ArrayList<>();
        int numBoxes = 20 ;
        VBox container = new VBox(5);
        for (int i = 1 ; i <= numBoxes ; i++) {
            checkBoxes.add(new CheckBox("Check box "+i));
        }
        container.getChildren().addAll(checkBoxes);
        EventHandler<ActionEvent> handler = event -> {
            CheckBox cb = (CheckBox) event.getSource() ;
            handleCheckBox(cb);
        };
        for (CheckBox cb : checkBoxes) {
            cb.setOnAction(handler);
        }
        Scene scene = new Scene(new ScrollPane(container), 200, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private void handleCheckBox(CheckBox cb) {
        System.out.println(cb.getText() + (cb.isSelected() ? " selected" : " deselected"));
    }
    public static void main(String[] args) {
        launch(args);
    }
}

最新更新