gpt4 book ai didi

java - 如何将事件处理程序添加到 ListView 复选框单元格中的复选框?

转载 作者:行者123 更新时间:2023-11-30 08:28:54 25 4
gpt4 key购买 nike

我正在创建一个卡片列表,用户可以从中选择开始游戏。用户通过卡片名称旁边的复选框选择他们的卡片,他们只能选择 10 张卡片。我希望能够通过在单击复选框时调用事件处理程序来限制可以选择的复选框的数量,并确定是否允许单击该复选框。我如何向每个复选框添加事件处理程序来执行此操作?如果有更好的方法,我绝对愿意接受建议。这是我设置 ListView 和复选框回调的代码:

ListView<Card> cards;
Callback<Card, ObservableValue<Boolean>> checkBoxCallback = new Callback<Card, ObservableValue<Boolean>>() {
@Override
public BooleanProperty call(Card card) {
return card.selectedProperty();
}
};

StringConverter<Card> cardToStringConverter = new StringConverter<Card>() {
@Override
public Card fromString(String card) {
try {
return CardFactory.createCard(card);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

@Override
public String toString(Card card) {
return card.toString();
}

};

Callback<ListView<Card>, ListCell<Card>> listViewCallback = CheckBoxListCell.forListView(checkBoxCallback, cardToStringConverter);
cards.setCellFactory(listViewCallback);
cards.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Card>() {
@Override
public void changed(ObservableValue<? extends Card> obsValue,
Card oldValue, Card newValue) {
cardImageView.setImage(newValue.getCardImage());
}
});

最佳答案

CheckBoxListCell.forListView()的getSelectedPropertyCallback参数是双向绑定(bind)的,

(meaning that the CheckBox in the cell will set/unset this property based on user interactions, and the CheckBox will reflect the state of the ObservableValue, if it changes externally).

因此向 Card.selectedProperty() 添加一个更改监听器可能会更准确,覆盖复选框和其他控件/ setter 的外部修改。

final IntegerProperty count = new SimpleIntegerProperty(0);
Text text = new Text("-");
// Bind count to text, to show on scene.
text.textProperty().bind(count.asString());

ChangeListener listener = new ChangeListener<Boolean>() {
@Override
public void changed(final ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
count.set(count.get() + (newValue ? 1 : -1));
if (count.get() >= 10) {
System.out.println("exceeded max limit");
// Revert selection
Platform.runLater(new Runnable() {
@Override
public void run() {
((BooleanProperty) observable).set(false);
}
});
}
}
};
for (final Card card : cards.getItems()) {
card.selectedProperty().addListener(listener);
}

在用户工作结束时,移除监听器。

for (final Card card : cards.getItems()) {
card.selectedProperty().removeListener(listener);
}

或者,如果您严格只想将监听器添加到复选框,则可以创建内部具有复选框的自定义 ListCell 并设置 ListView.cellFactory()。

关于java - 如何将事件处理程序添加到 ListView 复选框单元格中的复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19873029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com