我有2个列表视图,在右边的一个我有三个“卡”(名称和值),每个都有一个按钮,当点击时会将该卡添加到中心列表中。我也可以点击中心列表中该卡的相同按钮来删除它。我的问题是,如果我添加两个或更多的卡到中心列表中,然后我继续删除它们,界面会变得奇怪,不删除它们或只删除一两个。
public class DeckManagement implements Initializable {
private final SceneHandler sceneHandler = SceneHandler.getInstance();
@FXML
private ListView<Card> rightList;
@FXML
private ListView<Card> centerList;
@Override
public void initialize(URL location, ResourceBundle resources) {
rightList.setCellFactory(param -> new ListCell<Card>() {
@Override
protected void updateItem(Card card, boolean empty) {
super.updateItem(card, empty);
if (empty || card == null) {
setText(null);
} else {
VBox container = new VBox();
Button cardButton = new Button("Add");
cardButton.setOnAction(event -> {
if (!card.isMoved()) {
centerList.getItems().add(card);
//rightList.getItems().remove(card);
card.setMoved(true);
}
});
container.getChildren().addAll(new javafx.scene.control.Label(card.toString()), cardButton);
setGraphic(container);
}
}
});
rightList.getItems().addAll(
new Card("Card 1", 10),
new Card("Card 2", 5),
new Card("Card 3", 8)
);
centerList.setCellFactory(param -> new ListCell<Card>() {
@Override
protected void updateItem(Card card, boolean empty) {
super.updateItem(card, empty);
if (empty || card == null) {
setText(null);
} else {
VBox container = new VBox();
Button cardButton = new Button("Remove");
cardButton.setOnAction(event -> {
card.setMoved(false);
centerList.getItems().remove(card);
});
container.getChildren().addAll(new javafx.scene.control.Label(card.toString()), cardButton);
setGraphic(container);
}
}
});
}
}
1条答案
按热度按时间fdbelqdn1#
如果你的列表单元格变成非空的,它的
updateItem(...)
方法将被调用,其中Card
为非空值,empty
的值为false
。在这种情况下,你将该单元格的图形设置为VBox
。如果随后从
ListView
中删除了该单元格中显示的Card
示例,并且该单元格变为空,则将调用updateItem(null, true)
。但是,在本例中,updateItem(...)
实现不会删除图形,因此图形仍然显示。下面是一个应该可以工作的实现。我对它进行了重构,以避免重复创建新控件(这是非常低效的),并删除了不必要的重复代码。
请注意,如果您使用JavaFX属性来实现
Card
类以表示“moved”,则您的操作处理程序只需更新该属性,列表就可以自行处理:然后