有人可以告诉我如何禁用我的组合框的一些项目(使用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>
谢谢!
答案 0 :(得分: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));
} ...
答案 1 :(得分: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 ... />
答案 2 :(得分:0)
comboBox.setItems(FXCollections.observableArrayList(EnumValues.values()));
comboTipoOperacoes.getItems().remove(4); // remove the item 4 of Enums.
答案 3 :(得分:0)
我有同样的问题,我认为这个问题的最佳解决方案是使用 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
}
}
});