java - JavaFX 中的 setRowFactory 问题

标签 java javafx

我的应用程序使用 JavaFX 时遇到问题...在一个 View 中,我有一个包含人员列表的表格 View ,我想更改一个人的行样式。这是我的代码:

personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
        @Override
        public TableRow<Person> call(TableView<Person> personTableView) {
            return new TableRowRightFormat();
        }
    });

...

private class TableRowRightFormat extends TableRow {
    @Override
    protected void updateItem(Object o, boolean b) {
        super.updateItem(o, b);

        if(o == null) {
            return;
        }

        getStyleClass().remove("headPerson");

        if(((Person)o).getId()==2) {
            getStyleClass().add("headPerson");
        }
    }
}

它适用于一个人(id=2),但是当我向上滚动表格并且 id=2 的人消失时,另一个 id!=2 的人会获得名为“headPerson”的样式(可见元素上始终有一个人)在 tableview 中具有样式“headPerson”,但上面的代码只执行一次)。有什么问题吗?

最佳答案

更新:我在 JavaFX 2.2 和 JDK 8 上测试了您的代码,它似乎对于我的简单测试用例运行良好。逻辑似乎是正确的;在这些类型的基于样式类的单元格和行实现中,您必须真正小心的一件事是确保您不会将给定字符串的多个副本添加到样式类列表中 - 在您的实现中,这看起来是正确的。仔细检查并确保 add(...)remove(...) 方法中的字符串完全相同。

我喜欢以轻微的性能代价来完全防御这些:

private final String headPersonStyleClass = "headPerson" ;

private class TableRowRightFormat extends TableRow<Person> {

    @Override
    protected void updateItem(Person p, boolean b) {
        super.updateItem(p, b);

        ObservableList<String> styleClass = getStyleClass();
        if (p != null && p.getId()==2 && (! styleClass.contains(headPersonStyleClass))) {
            styleClass.add(headPersonStyleClass);
        } else {
            // remove all occurrences:
            styleClass.removeAll(Collections.singleton(headPersonStyleClass));
        }

    }
}

如果您使用的是 JavaFX 8,更好的方法是使用 PseudoClass 来实现此目的。

关于java - JavaFX 中的 setRowFactory 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23218946/

相关文章:

java - 如何在 Android 上预分配最大堆空间

HBox 上的 Java 节点动态位置

JavaFX:控制台登录 TextArea + 多线程和任务

当在 TextField 内按下 Enter 键时,JavaFX 程序会切换全屏

java - 使用 RSA key 使用 MSCAPI 包装

java - 如何使用 session.setAttribute ("id", id) onclick java servlet 中的按钮?

java - 如何获取新文档的主题 vector 并与Mallet中预定义的主题模型进行比较?

java - 如何为 JavaFX 文本字段设置固定高度而不考虑其内容?

javafx - 如何在 Scene Builder 中设置首选版本?

Netbeans 标准 FXML 应用程序出现 JavaFX 错误 - .fxml 文件的 Nullpointer