自定义CheckComboBox

时间:2017-10-26 17:51:18

标签: java javafx controlsfx

我正在使用来自ControlsFX项目的CheckComboBox控件。

但我想创建一个自定义规则:

当你点击Item0时,它应该清除所有其他选择。 如果再次单击Item0,它将保持选中状态。 如果选择Item(X),它将清除Item0并选择Item(X)。

这个想法是Item0应该是" All"选项。

enter image description here

编辑:此解决方案适用于ControlsFX。

1 个答案:

答案 0 :(得分:1)

我对ControlsFX不是很熟悉,但是我觉得我找到了解决问题的方法。以下是一个完整的例子。我希望这些评论能填补任何问题。

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

public class Main extends Application {

    public void start(Stage mainStage) throws Exception {


        ObservableList<String> items = FXCollections.observableArrayList();

        items.addAll(new String[] { "All", "Item 1", "Item 2", "Item 3", "Item 4" });

        CheckComboBox<String> controll = new CheckComboBox<String>(items);

        controll.getCheckModel().getCheckedItems().addListener(new ListChangeListener<String>() {
            public void onChanged(ListChangeListener.Change<? extends String> c) {

                while (c.next()) {
                    if (c.wasAdded()) {
                        if (c.toString().contains("All")) {

                            // if we call the getCheckModel().clearChecks() this will
                            // cause to "remove" the 'All' too at least inside the model.
                            // So we need to manually clear everything else
                            for (int i = 1; i < items.size(); i++) {
                                controll.getCheckModel().clearCheck(i);
                            }

                        } else {
                            // check if the "All" option is selected and if so remove it
                            if (controll.getCheckModel().isChecked(0)) {
                                controll.getCheckModel().clearCheck(0);
                            }

                        }
                    }
                }
            }
        });

        Scene scene = new Scene(controll);
        mainStage.setScene(scene);
        mainStage.show();
    }

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