在CONTROL FX的CheckListView上处理事件

时间:2015-06-17 10:10:16

标签: javafx controlsfx

我尝试使用Controls FXCheck List View组件,但我有几个问题如何使用它:

  • 默认情况下,当我在CheckListView中添加项目时,单元格未被选中,如何默认选中它?我想我必须使用setCheckModel,但我已经失去了。
  • 当有人点击checkBox 时如何处理事件?我不知道该怎么做,因为我处理的事件在节点上但在checkBox上没有。我不明白如何将eventHandler与此组件一起使用。

编辑: 这就是我的所作所为:

departureCheckListView.setItems(myListAirport.getObservableDepartureAirtport());
departureCheckListView.getItems().addListener(new ListChangeListener<String>() {
                     @Override
                     public void onChanged(Change<? extends String> c) {
                         c.next();
                         if (c.wasAdded()) {
                             System.out.println(c.getAddedSubList().get(0));
                             //departureCheckListView.getSelectionModel().select(c.getAddedSubList().get(0)); 
                             Platform.runLater(new Runnable() {
                                @Override
                                public void run() {
                                    departureCheckListView.getCheckModel().check(c.getAddedSubList().get(0));   
                                }
                            });
                         }
                     }
                });

检查我添加的第一个项目,但是后面的项目。

我不知道这是否有帮助,但我的清单已经整理好了。

1 个答案:

答案 0 :(得分:5)

对于您的第一个案例,请使用the List of ItemsCheckListView上的监听器,检查是否已添加某个项目,然后使用getSelectionModel().select(<Item>)选择它。

checkListView.getItems().addListener(new ListChangeListener<String>() {
     @Override
     public void onChanged(Change<? extends String> c) {
         c.next();
         if (c.wasAdded()) {
             checkListView.getSelectionModel().select(c.getAddedSubList().get(0));
         }
     }
});

对于第二种情况,使用getCheckModel().getCheckedItems()获取具有checked values的项目列表。同样,检查列表中的项目是否为added / removed

checkListView.getCheckModel().getCheckedItems().addListener(new ListChangeListener<String>() {
    @Override
    public void onChanged(ListChangeListener.Change<? extends String> c) {
        c.next();
        if(c.wasAdded()) {
             System.out.println("Item Checked : " + c.getAddedSubList().get(0));
        } else if (c.wasRemoved()) {
             System.out.println("Item Unchecked : " + c.getRemoved().get(0));
        }
    }
});

完成MCVE - 使用ControlsFX测试 - 8.40.9

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.controlsfx.control.CheckListView;

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        final ObservableList<String> listOfItems = FXCollections.observableArrayList();
        for (int i = 0; i <= 100; i++) {
            listOfItems.add("Item " + i);
        }
        final CheckListView<String> checkListView = new CheckListView<>(listOfItems);

        // Select the first checkListView element
        checkListView.getItems().addListener(new ListChangeListener<String>() {
            @Override
            public void onChanged(Change<? extends String> c) {
                c.next();
                if (c.wasAdded()) {
                    checkListView.getSelectionModel().select(c.getAddedSubList().get(0));
                }
            }
        });

        // On CheckBox event
        checkListView.getCheckModel().getCheckedItems().addListener(new ListChangeListener<String>() {
            @Override
            public void onChanged(ListChangeListener.Change<? extends String> c) {
                c.next();
                if(c.wasAdded()) {
                    System.out.println("Item Checked : " + c.getAddedSubList().get(0));
                } else if (c.wasRemoved()) {
                    System.out.println("Item Unchecked : " + c.getRemoved().get(0));
                }
            }
        });

    Button button = new Button("Add");
    button.setOnAction(e -> {
        checkListView.getItems().add(0, "Itachi");
            checkListView.requestFocus();
        });
        Scene scene = new Scene(new VBox(checkListView, button), 300, 275);
        primaryStage.setTitle("Welcome");
        primaryStage.setScene(scene);
        primaryStage.show();

    }
}

更新用于检查新添加的项目复选框,而不是选择

使用:

checkListView.getCheckModel().check(c.getAddedSubList().get(0));

而不是

checkListView.getSelectionModel().select(c.getAddedSubList().get(0));

如果您希望选中此选项并同时进行选择,则可以使用both of them