Как отключить некоторые элементы javaFX ComboBox?

Может ли кто-нибудь показать мне, как отключить какой-либо элемент моего поля со списком (с помощью кода FXML или Java)? вот мой ComboBox:

<ComboBox fx:id="cBox">
  <items>
    <FXCollections fx:factory="observableArrayList">
      <String fx:value="Easy" />
      <String fx:value="Normal" />
      <String fx:value="Hard" />
    </FXCollections>
  </items>
</ComboBox>

Спасибо!


person nvcnvn    schedule 27.11.2012    source источник


Ответы (3)



Я пытался добиться этого, и я придумал собственный ComboBox, который отключает элементы, которые я не хочу, чтобы пользователь выбирал. В приведенном ниже коде показан пользовательский класс ComboBox и показано, как его использовать.

    public class CustomComboBox<T> extends ComboBox<T> {

    private ArrayList<T> disabledItems = new ArrayList<T>();

    public CustomComboBox() {
        super();
        setup();
    }

    public CustomComboBox(ObservableList<T> list) {
        super(list);
        setup();
    }

    private void setup() {

        SingleSelectionModel<T> model = new SingleSelectionModel<T>() {

            @Override
            public void select(T item) {

                if (disabledItems.contains(item)) {
                    return;
                }

                super.select(item);
            }

            @Override
            public void select(int index) {
                T item = getItems().get(index);

                if (disabledItems.contains(item)) {
                    return;
                }

                super.select(index);
            }

            @Override
            protected int getItemCount() {
                return getItems().size();
            }

            @Override
            protected T getModelItem(int index) {
                return getItems().get(index);
            }

        };

        Callback<ListView<T>, ListCell<T>> callback = new Callback<ListView<T>, ListCell<T>>() {

            @Override
            public ListCell<T> call(ListView<T> param) {
                final ListCell<T> cell = new ListCell<T>() {
                    @Override
                    public void updateItem(T item, boolean empty) {

                        super.updateItem(item, empty);

                        if (item != null) {

                            setText(item.toString());

                            if (disabledItems.contains(item)) {
                                setTextFill(Color.LIGHTGRAY);
                                setDisable(true);
                            }

                        } else {

                            setText(null);

                        }
                    }
                };

                return cell;
            }

        };

        setSelectionModel(model);
        setCellFactory(callback);

    }

    public void setDisabledItems(T... items) {
        for (int i = 0; i < items.length; i++) {
            disabledItems.add(items[i]);
        }
    }

}

Затем добавьте элементы, которые нужно отключить, в ComboBox:

@FXML private CustomComboBox<String> customComboBox;
...
customComboBox.setDisabledItems("Item 2", "Item 3");

И измените класс в файле fxml:

<views.custom.CustomComboBox ... />
person Nidia    schedule 05.06.2015
comment
Другой (возможно, более простой?) Подход в http://stackoverflow.com/questions/32370394/javafx-combobox-change-value-causes-indexoutofboundsexception - person James_D; 03.09.2015
comment
Стоит отметить, что вместо того, чтобы устанавливать цвет из java, вам лучше установить его из CSS. если вы удалите строку setTextFill и вместо этого добавите элемент CSS .list-cell:disabled { -fx-text-fill: #D3D3D3 /*or -fx-opacity: 0.40*/ }, вы получите тот же эффект, но вам не придется вешаться, когда вы собираетесь применить CSS к своему приложению. Это работает, потому что setDisable(true) вызывает пометку ячейки с отключенным псевдоклассом CSS. - person Groostav; 30.12.2016

У меня была такая же проблема, и я думаю, что лучшим решением этой проблемы является использование setCellFactory (Callback, ListCell> value) для ComboBox:

        cBox.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
        @Override
        public ListCell<String> call(ListView<String> param)
        {
            return new ListCell<String>() {
                @Override
                protected void updateItem(String item, boolean empty)
                {
                    super.updateItem(item, empty);

                    if (item != null || !empty)
                    {
                        this.setText(item);
                        this.setDisable(true); //or false
                    }
                }
            };
        }
    });

и если вам нужна Custon ButtonCel, вам нужно использовать setButtonCell (значение ListCell) Метод:

        cBox.setButtonCell(new ListCell<String>() {
        @Override
        protected void updateItem(Stringitem, boolean empty)
        {
            super.updateItem(item, empty);

            if (item != null || !empty)
            {
                this.setText(item);
                this.setDisable(true); //or false
            }
        }
    });
person alcoolis    schedule 23.07.2017