【发布时间】:2016-03-17 12:51:25
【问题描述】:
我正在使用 JavaFX 和 String 的 ListView,例如,我在此列表中有 10 行,在另一个函数中进行了特定验证,我在第 3 行和第 7 行遇到错误。
我想要的是在第 3 行和第 7 行将单元格的背景涂成红色,以便向我的用户显示此行/行不好。
我检查了 setCellfactory 并 @Override 更新项目,但我找不到如何为多个特定行/行着色。
我不知道如何选择这一行以放置不同的 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 似乎使用默认的 ...
如何告诉我的列表视图使用 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);
}
}
【问题讨论】:
-
什么是
Analyse.linesErrorsList?它是一个可观察的列表吗?是否可以将有效值更改为无效,反之亦然,在这种情况下Analyse.linesErrorsList会自动更新吗? -
是的,这是一个可观察的列表。
标签: css listview javafx colors row