簡體   English   中英

如何將事件處理程序添加到列表視圖復選框單元格中的復選框?

[英]How do i add event handlers to checkboxes in a listview checkbox cell?

我正在創建一張卡列表,用戶可以從中選擇一張卡來開始游戲。 用戶通過卡名旁邊的復選框選擇卡,並且只能選擇10張卡。 我希望能夠通過單擊復選框時調用事件處理程序並確定是否允許單擊復選框來限制可以選擇的復選框的數量。 如何將事件處理程序添加到每個復選框以執行此操作? 如果有更好的方法,我絕對願意提出建議。 這是我設置列表視圖和復選框回調的代碼:

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()的getSelectedProperty Callback參數是雙向綁定的,

(這意味着單元格中的CheckBox將基於用戶交互設置/取消設置此屬性,並且CheckBox將在外部更改時反映ObservableValue的狀態)。

因此,將更改偵聽器添加到Card.selectedProperty()可能會更加准確,覆蓋復選框和其他控件/設置程序的外部修改。

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()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM