JavaFx, как выровнять только один заголовок столбца в табличном представлении?
Как выровнять заголовок только одного столбца в табличном представлении?
Следующий CSS выравнивает весь заголовок столбца, но я хочу выровнять только один столбец:
.table-view .column-header .label{
-fx-alignment:CENTER
}
4 ответа
Вы можете сделать это сейчас с последними версиями JavaFX.
Java 1.7
Это работало для меня с Java: 1.7.0_45 / JavaFX: 2.2.45-b18). Это должна быть последняя версия, потому что она требует RT-14909
Заголовок столбца автоматически получит тот же "Id", что и TableColumn! Поэтому вашим TableColumn(s) нужен (CSS-) Id, который вы можете либо установить в Scenebuilder для TableColumn напрямую, либо использовать некоторый код, такой как tableColumn.setId("my-special-column")
,
Затем вы можете стилизовать заголовок столбца напрямую, используя Id:
.table-view .column-header#my-special-column .label {
-fx-alignment: CENTER_RIGHT;
-fx-text-fill: red;
}
PS: Это заняло у меня несколько разочаровывающих 1,5 часов, чтобы понять. Надеюсь, что это помогает другим сейчас!
Java 8
По причинам, которые я не понимаю, трюк идентификатора больше не работает для Java 8. Однако, что мы можем сделать, это установить styleClass непосредственно для столбца (который внутренне распространяется в TableColumnHeader) и изменить этот styleClass в файле css:
В Java:
firstNameCol.getStyleClass().add("my-special-column-style");
И в CSS:
.my-special-column-style .label {
-fx-alignment: CENTER_RIGHT;
-fx-text-fill: red;
}
У меня работает здесь с jdk1.8.0_05 на Mac OS X.
Я боролся с этим сам, но нашел это решение. Это выровняет по правому краю один столбец, тогда как остальные столбцы в той же таблице будут выровнены по левому краю:
В коде:
myCol.getStyleClass().add("rightAlignedTableColumnHeader");
В CSS:
.column-header.rightAlignedTableColumnHeader > .label {
-fx-alignment: center-right;
}
Ни одно из этих решений не помогло мне (не знаю почему). Я использую jdk1.8.0_66 на Windows.
Это немного взломать, но это работает:
// Hack: align column headers to the center.
table.widthProperty().addListener((src, o, n) -> Platform.runLater(() -> {
if (o != null && o.intValue() > 0) return; // already aligned
for (Node node: table.lookupAll(".column-header > .label")) {
if (node instanceof Label) ((Label)node).setAlignment(Pos.CENTER);
}
}));
@DOM @void256 за то, что стоит я попробовал твой код и он отлично работает. Я также попробовал этот код, и он работает, в чем заключается загадка, которую мне пришлось использовать в верхнем левом углу, так как CENTER_RIGHT не будет работать. Я использую jre 1.8.0_45 с eclipse luna. Другая странная проблема - если вы установите это в Scene Builder, он будет работать не с текстом заголовка, а с текстом столбца.
public void initialize(URL arg0, ResourceBundle arg1) {
firstNameColumn.getStyleClass().add("top-left");
lastNameColumn.getStyleClass().add("any-this-works-here;");
phoneNumberColumn.getStyleClass().add("top-left;");
emailAddressColumn.getStyleClass().add("top-left;");
}
.table-view .column-header .label{
-fx-font-size: 12pt;
-fx-text-fill: blue;
-fx-alignment:top-left;
}