1

誰かがコンボボックスの一部のアイテムを無効にする方法を教えてもらえますか (FXML または Java コードを使用)? ここに私のコンボボックスがあります:

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

ありがとう!

4

4 に答える 4

1

ComboBoxアイテムを非アクティブ化できるメソッドが見つかりませんでした。この回避策を試すことができます。以下のコードは、アイテムのサブリストを動的に表示することです(このアイデアを使用して問題を解決してください)。

private final ObservableList<String> allOptions = 
            FXCollections.observableArrayList("Easy","Normal","Hard");

   // method which returns sublist we need
    private ObservableList<String> getSubList(int start,int end) {

    final ObservableList<String> toBeDisplayedList = FXCollections
            .<String> observableArrayList();
    toBeDisplayedList.addAll(allOptions.subList(start, end));
    return toBeDisplayedList;
    }

   // now main logic
 if(displayAll) {
          comboBox.setItems(allOptions);
         }
 if(display only easy and normal) {
      comboBox.setItems(getSublist(0,2));
  } ...
于 2012-11-27T19:11:54.353 に答える
1

私はこれを達成しようとしていましたが、ユーザーに選択させたくない項目を無効にするカスタム 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 ... />
于 2015-06-05T09:18:41.213 に答える
1

私は同じ問題を抱えていましたが、この問題の最善の解決策は、ComboBox の setCellFactory(Callback,ListCell> value)メソッドを使用することだと思います。

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

また、カスタム ButtonCel が必要な場合は、setButtonCell(ListCell value)メソッドを使用する必要があります。

        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
            }
        }
    });
于 2017-07-23T13:17:45.460 に答える
0
comboBox.setItems(FXCollections.observableArrayList(EnumValues.values()));  
comboTipoOperacoes.getItems().remove(4); // remove the item 4 of Enums.
于 2016-06-12T16:11:50.880 に答える