У меня аномалия с фабрикой ячеек java ListView.У меня есть оператор if , который просто оценивает, равен ли элемент ячейки другому, если это так, тогда я просто изменяю цвет текста ячейки.Но по странной причине, после того, как я добавляю новый элемент в ListView, другие ячейки (я) или элемент (ы) удовлетворяют условию, так что в результате получается много ячеек с измененным цветом против моей воли.
Я использую JFXListView пользовательский ListView из библиотеки JFoenix Material Design.Также у меня была такая же проблема и раньше, но при изменении значения свойства disable, когда я прокручивал просмотр списка, произошла та же самая аномалия!Одна ячейка, которая не была отключена, была отключена после прокрутки (элемент был скрыт при прокрутке, и когда он перестал скрываться, аномалия стала проявляться (ячейка отключалась против моей воли).
zoneListView.setCellFactory(listSelectionView ->
{
ListCell<String> cell = new ListCell<String>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
setOnDragEntered(event -> setTextFill(Color.DARKRED));
setOnDragExited(event -> setTextFill(Color.BLACK));
setOnDragOver(event -> {
if (event.getGestureSource() != this &&
event.getDragboard().hasString()) {
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
});
setOnDragDropped(event ->
{
if (getItem() == null) {
return;
}
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasString()) {
int index = Integer.valueOf(db.getString());
XBeeNode node = nodeListView.getItems().get(index);
if (node != null) {
if (!node.getZone().equals(getItem())) {
String actual_zone = node.getZone();
if (!changedNodes.containsKey(node)) {
changedNodes.put(node, node.getZone());
System.out.println(changedNodes.toString());
}
node.getZone();
node.setZone(getItem());
NodesFilteredList.setPredicate(data ->
{
if (actual_zone == null || actual_zone.isEmpty())
return true;
if (actual_zone.equals("*"))
return true;
else if ((data.getZone().equals(actual_zone) ))
return true;
else if (data.getZone().endsWith(actual_zone))
return true;
else return false;
});
}
}
success = true;
}
/* let the source know whether the string was successfully
* transferred and used */
event.setDropCompleted(success);
event.consume();
});
if (item.equals("*"))
setTextFill(Color.RED); // Here is where change the text color
setText(item == null ? "null" : item.toString());
setGraphic(null);
}
}
};
cell.setOnDragDone(DragEvent::consume);
return cell;
})
Итак, у меня есть следующие пункты списка инициализации:
- *
- A
- Z00
В начале только первый элемент («*») имеет красный цвет текста. Но, как я уже говорил, после добавления нового элемента другая ячейка меняет свой цвет.
Пример проблемы