簡體   English   中英

JavaFX-控件組的事件處理程序

[英]JavaFX - Event handler for group of controls

我目前有一個CheckBox控件的ArrayList。 每當用戶選中或取消選中某個框時,我都會嘗試捕獲。 但是,如果不為每個復選框編寫單獨的處理程序,我將無法解決如何做到這一點,這實際上是不可行的。

我看過其他答案,但它們都針對特定項目。 有人可以直接向我指出如何捕獲整個控件組的事件嗎?

最終目標:在handle()方法中確定選中(或未選中)哪個復選框並采取相應的措施。

謝謝您的幫助,因為我是新編碼員!

最簡單的方法是為每個復選框創建一個不同的處理程序:

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);
    }
}

嘗試對所有CheckBoxes列表使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM