Переопределить стиль TableRow в TableCell - PullRequest
0 голосов
/ 07 октября 2019

поэтому у меня следующая проблема. У меня есть 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 Ответ

1 голос
/ 07 октября 2019

Проблема в том, что свойство -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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...