在TableCell上重写TableRow样式

时间:2019-10-07 15:47:09

标签: javafx

所以我有以下问题。 我有一个JavaFX TableView,其中所有单元格都具有相同的样式,但只有一种。对于那一个单元格,我想删除所有样式,但是我猜RowFactory有一定的优先级。

我有类似的代码:

FXML

<TableView fx:id="tableView">
    <columns>
        <TableColumn fx:id="tcolNoStyle"/>
        <TableColumn fx:id="tcolStyled"/>
    </columns>
</TableView>

控制器

public class TableController {
    @FXML
    TableView<TableData> tableView;
    @FXML
    TableColumn<TableData, String> tcolNoStyle;
    @FXML
    TableColumn<TableData, String> tcolStyled;

    @FXML
    public void initialize(){
        tableView.setRowFactory(row -> new RowFactory());
        tcolNoStyle.setCellFactory(cell -> new CellFactoryForNoStyling());
    }
}

表格后的数据

public class TableData {
    public final SimpleStringProperty noStyleTextProperty;
    public final SimpleStringProperty styledTextProperty;

    public TableData(){
        noStyleTextProperty = new SimpleStringProperty();
        styledTextProperty = new SimpleStringProperty();
    }
}

RowFactory

public class RowFactory extends TableRow<TableData> {
    public RowFactory(){
        itemProperty().addListener(((observable, oldValue, newValue) -> {
            if (newValue != null){
                setStyle("-fx-text-alignment: right");
            }
        }));
    }
}

没有样式的单元格的CellFactory

public class CellFactoryForNoStyling extends TableCell<TableData, String> {
    public CellFactoryForNoStyling(){
        super();
        setStyle(null);
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        setStyle(null);
    }
}

所以我想要的是,只有那一栏应该没有样式

提前谢谢!

1 个答案:

答案 0 :(得分:1)

这里的问题是-fx-text-alignment属性被继承的事实。 setStyle(null)仅确保对它所需要的节点没有其他更改。

最简单的选择可能是使用setStyle简单指定默认值:

public CellFactoryForNoStyling() {
    setStyle("-fx-text-alignment: left");
}

您可以将样式留给CSS样式表。这比使用内联样式要方便得多,因为用这种方式处理选择,焦点等很容易。

您可以例如在场景中添加以下样式表;这样,您就不会使用自定义的cellValueFactory / rowFactory

/* default cell style */
.my-table .table-cell {
    -fx-text-alignment: right;
}

/* overwrite above style using selector with higher specifity */
.my-table .table-cell.unstyled {
    -fx-text-alignment: inherit;
}
<TableView fx:id="tableView" styleClass="my-table"> <!-- style class added here-->
    <columns>
        <TableColumn fx:id="tcolNoStyle" styleClass="unstyled"/> <!-- style class added here -->
        <TableColumn fx:id="tcolStyled"/>
    </columns>
</TableView>