双击JavaFX TableView自定义行样式

时间:2018-08-20 12:27:55

标签: css javafx

我的JavaFX应用程序中有一个TableView。 我想在双击行时为其设置不同的样式,并在单击时为其设置不同的样式。

这是我实现的目标:

final PseudoClass doubleClickPseudoClass = PseudoClass.getPseudoClass("new");
setRowFactory(tableView -> {
    final TableRow<Bean> row = new TableRow<Bean>();
    row.setOnMouseClicked(event -> {
        if (event.getClickCount() == 2 && (! row.isEmpty())) {
            row.pseudoClassStateChanged(doubleClickPseudoClass, true);
    });

    return row;
});

但是,当用户双击每个新行时,我希望对所有以前双击的行进行样式设置而无需应用“ new”类: row.pseudoClassStateChanged(doubleClickPseudoClass,false);

我该怎么做? 现在,我已经为双击的所有行设置了样式。

1 个答案:

答案 0 :(得分:2)

您不应使用TableRow来自己存储状态,因为可能会将新项目分配给TableRow实例。而是使用属性来存储双击项,然后使用侦听器对行进行样式设置:

final ObjectProperty<Bean> doubleClickedObject = new SimpleObjectProperty<>();
setRowFactory(tableView -> new TableRow<Bean>() {
    private void updateStyle() {
        pseudoClassStateChanged(doubleClickPseudoClass, !isEmpty() && doubleClickedObject.get() == getItem());
    }

    private final InvalidationListener listener;

    {
        listener = o -> updateStyle();
        doubleClickedObject.addListener(new WeakInvalidationListener(listener));

        setOnMouseClicked(event -> {
            if (!isEmpty() && event.getClickCount() == 2) {
                doubleClickedObject.set(getItem());
            }
        });
    }

    @Override
    protected void updateItem(Bean item, boolean empty) {
        super.updateItem(item, empty);
        updateStyle();
    }
});