2016-06-19 3 views
0

В настоящее время у меня есть ArrayList элементов управления CheckBox. Я пытаюсь захватить любое время, когда пользователь проверяет или снимает флажок. Однако я не могу понять, как это сделать, не создавая отдельного обработчика для каждого флажка, что действительно невозможно.JavaFX - обработчик событий для группы элементов управления

Я просмотрел другие ответы, но все они видят очень специфический для конкретного проекта. Может ли кто-то просто указать мне прямо на то, как захватывать события для целой группы элементов управления?

Конечная цель: определить в методе handle(), который был установлен (или снят) с соответствующим флажком.

Благодарим за помощь, так как я новый кодер!

+0

Почему не представляется возможным написать отдельный обработчик для каждого? –

ответ

0

Попробуйте использовать 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); 
} 
0

Самый простой способ создать другой обработчик для каждого чекбокса:

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); 
    } 
} 
Смежные вопросы