css - 带有 JavaFX 的 ListView 中的颜色特定行

标签 css listview javafx colors row

我正在使用 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/

相关文章:

java - 将两个数组添加到 JavaFX TableView 中的两列

Java 外汇 : TableView - display simple HTML

无法通过将鼠标移开来取消 JavaFX MenuItem

javascript - 从四面八方增加圆圈 CSS

html - 如何在没有JS的情况下添加菜单切换?

android - 如何显示消息的实时进度?使用什么数据结构/ View ?

android - 如何处理 ListView 中的 ViewStub

html - Flexbox 和 Internet Explorer 11(显示 :flex in <html>? )

CSS展开宽度

Android 自定义 Listview 未显示