是否可以在CheckComboBox中添加标题/标签?我正在考虑无法选择的默认项目。我使用的内联表单没有输入字段的标签。我想对CheckComboBox使用内联标题。

最佳答案

据我所知,API中没有此功能。

但是我前一段时间在ComboBox上自己实现了此功能,我认为您可以对其进行调整以适应您的需求。我在下面发布了此内容的MCVE。至少您知道了。

编辑:似乎CheckComboBox没有setCellFactory方法。因此,也许我的实现没有太大帮助。也许一种替代方法是从普通CheckComboBox中的ComboBox实现自己的JavaFX

MCVE:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class MCVE extends Application {

    @Override
    public void start(Stage stage) {
        HBox box = new HBox();

        ComboBox<ComboBoxItem> cb = new ComboBox<ComboBoxItem>();

        cb.setCellFactory(e -> new ListCell<ComboBoxItem>() {
            @Override
            public void updateItem(ComboBoxItem item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                    setDisable(false);
                } else {
                    setText(item.toString());

                    // If item is a header we disable it.
                    setDisable(!item.isHeader());

                    // If item is a header we add a style to it so it looks like a header.
                    if (item.isHeader()) {
                            setStyle("-fx-font-weight: bold;");
                    } else {
                        setStyle("-fx-font-weight: normal;");
                    }
                }
            }
        });

        ObservableList<ComboBoxItem> items = FXCollections.observableArrayList(new ComboBoxItem("Header", true),
                new ComboBoxItem("Option", false));

        cb.getItems().addAll(items);

        box.getChildren().add(cb);

        stage.setScene(new Scene(box));
        stage.show();
    }

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

    /**
     * A wrapping class for a String that also has a boolean that indicates
     * whether this item should be disabled or not.
     *
     * @author Jonatan Stenbacka
     */
    public class ComboBoxItem implements Comparable<ComboBoxItem> {

        private String text;
        private boolean isHeader = false;

        public ComboBoxItem(String text, boolean isHeader) {

            this.text = text;
            this.isHeader = isHeader;
        }

        public ComboBoxItem(String text) {
            this.text = text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public String getText() {
            return text;
        }

        public boolean isHeader() {
            return isHeader;
        }

        @Override
        public String toString() {
            return text;
        }

        @Override
        public boolean equals(Object obj) {
            if (obj == this) {
                return true;
            } else if (obj instanceof ComboBoxItem) {
                ComboBoxItem item = (ComboBoxItem) obj;
                if (text.equals(item.getText())) {
                    return true;
                }
            } else if (obj instanceof String) {
                String item = (String) obj;
                if (text.equals(item)) {
                    return true;
                }
            }

            return false;
        }

        @Override
        public int compareTo(ComboBoxItem o) {
            return getText().compareTo(o.getText());
        }

        @Override
        public int hashCode() {
            return text.hashCode();
        }
    }
}

09-12 22:38