【问题标题】:Color specific Row in ListView with JavaFX使用 JavaFX 在 ListView 中指定颜色的行
【发布时间】: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


【解决方案1】:

你可以这样做:

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);
    }
});

【讨论】:

  • 谢谢,但最后的 BooleanBinding 行中缺少一些东西...... Eclipse 告诉我这里缺少一些东西
  • 有几个错别字:认为现在已经修复了。
  • 谢谢你的 rox :) 我必须更好地理解你的代码 ^^ 我才 4 个月才开始编码 :)
  • 你对我的问题@James_D 有什么解决方案吗?我不明白如何告诉我的列表视图每次都使用我的 CellFactory 覆盖...我的列表视图在开始时只使用我的覆盖...提前谢谢
  • 我不明白您在最新编辑中的意思。可能您需要提供一个完整的示例。见minimal reproducible example
猜你喜欢
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多