我正在使用 JavaFX 和一个 String 的 ListView,例如我在这个列表中有 10 行,在另一个函数中进行了特定的验证,我在第 3 行和第 7 行遇到了错误。
我想要的是将第 3 行和第 7 行的单元格背景涂成红色,以便向我的用户表明这一行/行不好。
我检查了 setCellfactory 和我 @Override updateItem 但我找不到如何为多个特定行/行着色。
我不知道如何选择这一行以放置不同的 CSS 样式或简单地用 Java 为其着色。
预先感谢您的帮助。
已编辑
实际上我正在尝试那样做......
ListViewCenter().setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> list) {
final ListCell<String> cell = new ListCell<String>();
for (int i = 0; i < Analyse.linesErrorsList.size(); i++) {
if (cell.getIndex() == Analyse.linesErrorsList.get(i)) {
cell.setStyle("-fx-text-fill:red;");
}
}
return cell;
}
});
我的 Analyse.linesErrorsList 是错误行的列表 ...
已编辑
一个解决方案是
listViewCenter().setCellFactory(list -> {
// usual list cell:
ListCell<String> cell = new ListCell<String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : item);
}
};
BooleanBinding invalid = Bindings.createBooleanBinding(
() -> Analyse.linesErrorsList.contains(new Integer(cell.getIndex())),
cell.indexProperty(), Analyse.linesErrorsList
);
invalid.addListener((obs, wasInvalid, isNowInvalid) -> {
if (isNowInvalid) {
cell.setStyle("-fx-text-fill:red;");
} else {
cell.setStyle("");
}
});
return cell ;
});
@James_D 你能再帮我一下吗,当我向下滚动到列表的末尾并返回到开头时,我遇到了一个问题......
显然我的 Listview 调用了 CellFactory 但它没有使用我的 CellFactory 的 @Override ... 我的 listview 似乎使用默认的 ...
我如何告诉我的 ListView 使用我的 CellFactory 的 @Override ... 提前致谢...
已编辑
所以这是我向您展示的最少代码:)
package test;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class thisMy extends Application {
static ListView<String> listview;
@Override
public void start(Stage primaryStage) {
listview = new ListView<String>();
ObservableList<String> listOfString = FXCollections.observableArrayList();
ObservableList<Integer> errorList = FXCollections.observableArrayList();
for (int i = 0; i < 1000; i++) {
listOfString.add("This my line" + i);
}
errorList.addAll(0, 2, 5, 78, 598, 124, 368, 888, 997, 614, 741);
listview.setItems(listOfString);
listview.setCellFactory(list -> {
// usual list cell:
ListCell<String> cell = new ListCell<String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : item);
}
};
BooleanBinding invalid = Bindings.createBooleanBinding(
() -> errorList.contains(new Integer(cell.getIndex())), cell.indexProperty(), cell.itemProperty(),
errorList);
invalid.addListener((obs, wasInvalid, isNowInvalid) -> {
if (isNowInvalid) {
cell.setStyle("-fx-text-fill:red;");
} else {
cell.setStyle("");
}
});
return cell;
});
primaryStage.setTitle("Test for listview");
StackPane root = new StackPane();
root.getChildren().add(listview);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
最佳答案
你可以这样做:
listViewCenter().setCellFactory(list -> new ListCell<String>() {
BooleanBinding invalid ;
{
invalid = Bindings.createBooleanBinding(
() -> Analyse.linesErrorsList.contains(new Integer(getIndex())),
indexProperty(), itemProperty(), Analyse.linesErrorsList
);
invalid.addListener((obs, wasInvalid, isNowInvalid) -> {
if (isNowInvalid) {
setStyle("-fx-text-fill:red;");
} else {
setStyle("");
}
});
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : item);
}
});
关于css - 带有 JavaFX 的 ListView 中的颜色特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36061089/