JavaFX - обработчик событий для группы элементов управления
В настоящее время у меня есть ArrayList элементов управления CheckBox. Я пытаюсь захватить каждый раз, когда пользователь проверяет или снимает флажок. Однако я не могу понять, как это сделать, не написав отдельный обработчик для каждого флажка, что на самом деле невозможно.
Я посмотрел на другие ответы, но все они видят очень специфические для конкретного проекта. Может ли кто-то прямо указать мне прямо на то, как захватывать события для целой группы элементов управления?
Конечная цель: Определите в методе handle(), какой флажок был отмечен (или не отмечен), и действуйте соответствующим образом.
Спасибо за вашу помощь, так как я новый кодер!
2 ответа
Попробуйте использовать EventHandler
для всего списка CheckBoxes.
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);
}
}