【问题标题】:Is there any way to change style of one row in tableview in javafx?有没有办法改变javafx中tableview中一行的样式?
【发布时间】:2014-06-02 22:00:06
【问题描述】:

在我使用 javafx 的应用程序中,我有一个包含几行的 tableview。我想在一行中更改符合我自己要求的 CSS 样式。我试过了:

personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
            @Override
            public TableRow<Person> call(TableView<Person> personTableView) {
                return new TableRow<Person>() {
                    @Override
                    protected void updateItem(Person person, boolean b) {
                        super.updateItem(person, b);
                        if(.../*my requirements*/) {                     
                            getStyleClass().add("priorityLow");
                        }
                    }
                };
            }
        });

但它不起作用。谁能帮我 ? :)

【问题讨论】:

  • 你能展示你的css吗?您应该会看到一些更改,但您需要更多逻辑:仅在样式不存在时添加样式,如果您的条件为 false 则将其删除。
  • 那行不通,因为当我滚动时,我的 tableview 行是混合的,不符合要求的行会得到 'priorityLow;风格...

标签: java javafx


【解决方案1】:

如果项目 (person) 为 NULL,则不运行验证。

这应该适合你。

personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() 
{
    @Override public TableRow<Person> call(TableView<Person> personTableView) 
    {
        return new TableRow<Person>() 
        {
            @Override protected void updateItem(Person person, boolean b) 
            {
                super.updateItem(person, b);

                if (person == null)
                    return;

                if(Priority.LOW.equals(person.getPriority())) // Example requirement
                {                     
                    getStyleClass().add("priorityLow");
                }
            }
        };
    }
});

【讨论】:

    【解决方案2】:

    请参阅 Programmatically change the TableView row appearance 以获取有关此主题的更全面讨论。

    由于单元格被重复使用,您需要确保只为每个单元格添加一次样式类。 (在您当前的代码中,如果项目从您的条件为真的一项更改为您的条件为真的另一项,则样式类列表将包含重复的“priorityLow”条目。最终,您可能会耗尽内存通过复制这一点。)

    此外,如果您的条件为假,您需要删除任何出现的“priorityLow”。 (在您当前的代码中,如果项目从您的条件为真的一项更改为您的条件为假的一项,“priorityLow”类将保持错误附加。)

    类似这样的:

    personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
                @Override
                public TableRow<Person> call(TableView<Person> personTableView) {
                    return new TableRow<Person>() {
                        @Override
                        protected void updateItem(Person person, boolean b) {
                            super.updateItem(person, b);
                            if(.../*my requirements*/) { 
                                ObservableList<String> styles = getStyleClass();
                                if (! styles.contains("priorityLow")) {                    
                                    getStyleClass().add("priorityLow");
                                }
                            } else {
                                // Remove all occurrences of "priorityLow":
                                styles.removeAll(Collections.singleton("priorityLow"));
                            }
                        }
                    };
                }
            });
    

    如果您使用的是 JavaFX 8,使用PseudoClasses 的解决方案会更干净、更高效:

    更新 PseudoClass 版本(仅限 Java 8):

    final PseudoClass lowPriorityPseudoClass = PseudoClass.getPseudoClass("priority-low");
    personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
                @Override
                public TableRow<Person> call(TableView<Person> personTableView) {
                    return new TableRow<Person>() {
                        @Override
                        protected void updateItem(Person person, boolean b) {
                            super.updateItem(person, b);
                            boolean lowPriority = /* my requirements */ ;
                            pseudoClassStateChanged(lowPriorityPseudoClass, lowPriority);
                        }
                    };
                }
            });
    

    css 看起来像:

    .table-row-cell:priority-low {
     /* styles specific for low priority row */
    }
    

    【讨论】:

    • 你解释伪类的部分对我很有帮助,谢谢!当我实现它时,我在boolean lowPriority = (person.getAmount() &lt; 0) 上得到一个空指针异常。关于为什么的任何想法?注意:我已将此代码放在显示 Tableview 的屏幕的初始化中。
    • 如果单元格为空(可能在其他时间),所有单元格工厂(其中行工厂是示例)将收到null 项,因此您必须始终编写代码来处理它:@ 987654328@
    • 啊应该知道!还在学习java和javafx,感谢您的耐心和帮助!它现在就像一个魅力!
    猜你喜欢
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多