【问题标题】:How do I dynamically change the background of an item in a listview in JavaFX如何在 JavaFX 的列表视图中动态更改项目的背景
【发布时间】:2015-12-18 04:49:36
【问题描述】:

我正在编写一个将一组项目放在列表视图中的程序。 然后它检查是否在数据库中找到项目。如果在数据库中找不到该项目,我想在我的列表视图中更改该项目的背景。 我正在为这个程序使用 JavaFX。

我该怎么做?

【问题讨论】:

  • 请显示一些代码 - 最好是 minimal reproducible example,其中包括列表中项目和单元工厂(如果有)的类定义。
  • 请粘贴您所描述的代码,并告诉我们您到目前为止所做的尝试。

标签: java listview javafx colors


【解决方案1】:

您可以为 ListView 使用自定义单元工厂,以检查条件并将适当的 css 样式类应用于每个项目/单元格。

下面的代码展示了如何为具有 String 类型的项的 Listview 执行此操作。

     listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>(){

        @Override
        public ListCell<String> call(ListView<String> p) {

            ListCell<String> cell = new ListCell<String>(){

                @Override
                protected void updateItem(String t, boolean bln) {
                    super.updateItem(t, bln);
                    if (t != null ) {
                        setText( t);

                        if (item_is_not_available){

                            if (!getStyleClass().contains("mystyleclass") {
                                getStyleClass().add("mystyleclass");
                            }

                        } else {
                            getStyleClass().remove("mystyleclass");
                        }
                    } else {
                        setText("");
                    }
                }

            };

            return cell;
        }
    });

在您的 css 文件中,mystyleclass 的可能定义可能如下所示(以红色背景显示不可用的项目):

.mystyleclass{
    -fx-background-color: #ff0000;
}

【讨论】:

  • 这充满了错误。您必须在updateItem(...) 方法中处理项目为null 的情况。如果单元格从可用项更新为不可用项,您还必须删除样式类,并且您需要确保不会将"mystyleclass" 多次添加到同一个单元格。
  • 我编辑了答案。至于“如果单元格从可用项目更新为不可用项目,您还必须删除样式类”,我假设该示例足以理解概念手处理其他情况。
  • 但它实际上不起作用。使用此实现,如果用户滚动,错误的单元格将具有给定的样式类。
  • 你是对的。现在添加了缺少的部分,甚至尝试运行它并且它可以工作。
  • 既然OP想要改变背景,你也可以通过添加“mystyleclass”的定义来完成答案。
猜你喜欢
  • 2013-07-16
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多