如何更改 java 表格样式表中的字体大小
How to change font size in the stylesheet of the tables in java
我的目标
我想让用户选择调整 header 的大小和我应用程序中所有 table 的行文本大小(有很多这样的选项,所以更改 CSS 每一个都不是我的选择),通过滑块,我正在使用 CSS styleSheet 修改我的 table 样式,并且我已将它附加到根目录。
我的TableCss
.table-view .column-header {
-fx-font-size: 14px;
}
我的问题
有什么方法可以从 java(样式表之外)
修改上面样式表中的默认 header 字体大小 (14px)
备注
正如我已经提到的,样式表附加到根目录,而不是直接附加到 tables。
我正在使用 JavaFX 16
此解决方案需要 JavaFX 17 使用数据 URL。
调用提供的函数,传入一些 parent 节点,其中包含 table 个您要调整其 headers 大小的节点。
它将删除节点上所有现有的用户样式表,因此不要在应用了现有样式表的节点上调用它。
private void setTableHeaderFontSize(Region parent, int size) {
parent.getStylesheets().setAll(
"""
data:text/css,
.table-view .column-header {
-fx-font-size:
"""
+ size + "px;}"
);
}
示例应用程序
下面的示例将 table 节点传递给 CSS 样式函数,但您无需将其直接应用于 table,您可以将其应用于任何parent 节点,它将应用于节点层次结构中的任何 table children。
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
public class RecordTableViewer extends Application {
public record Person(String last, String first, int age) {}
private final IntegerProperty fontSize = new SimpleIntegerProperty();
@Override
public void start(Stage stage) {
TableView<Person> table = createTable();
populateTable(table);
Pane controls = createControls();
VBox layout = new VBox(
10,
controls,
table
);
layout.setPadding(new Insets(10));
layout.setPrefSize(300, 300);
setTableHeaderFontSize(table, fontSize.intValue());
fontSize.addListener((observable, oldValue, newValue) ->
setTableHeaderFontSize(table, newValue.intValue())
);
stage.setScene(new Scene(layout));
stage.show();
}
private TableView<Person> createTable() {
TableView<Person> table = new TableView<>();
TableColumn<Person, String> lastColumn = new TableColumn<>("Last");
lastColumn.setCellValueFactory(
p -> new SimpleStringProperty(p.getValue().last())
);
TableColumn<Person, String> firstColumn = new TableColumn<>("First");
firstColumn.setCellValueFactory(
p -> new SimpleStringProperty(p.getValue().first())
);
TableColumn<Person, Integer> ageColumn = new TableColumn<>("Age");
ageColumn.setCellValueFactory(
p -> new SimpleIntegerProperty(p.getValue().age()).asObject()
);
ageColumn.setPrefWidth(60);
//noinspection unchecked
table.getColumns().addAll(lastColumn, firstColumn, ageColumn);
return table;
}
private void populateTable(TableView<Person> table) {
table.getItems().setAll(
new Person("Smith", "Justin", 41),
new Person("Smith", "Sheila", 42),
new Person("Morrison", "Paul", 58),
new Person("Tyx", "Kylee", 40),
new Person("Lincoln", "Abraham", 200)
);
}
private HBox createControls() {
Slider fontSizeSlider = new Slider(8, 24, 14);
fontSizeSlider.setMajorTickUnit(2);
fontSizeSlider.setMinorTickCount(0);
fontSizeSlider.setShowTickMarks(true);
fontSize.setValue((int) Math.round(fontSizeSlider.getValue()));
fontSizeSlider.valueProperty().addListener((observable, oldValue, newValue) ->
fontSize.setValue((int) Math.round(newValue.doubleValue()))
);
Label fontSizeLabel = new Label();
fontSizeLabel.textProperty().bind(
fontSize.asString()
);
return new HBox(
10,
new Label("Table header size: "),
fontSizeSlider,
fontSizeLabel
);
}
private void setTableHeaderFontSize(Region parent, int size) {
parent.getStylesheets().setAll("""
data:text/css,
.table-view .column-header {
-fx-font-size:
"""
+ size + "px;}"
);
}
}
我的目标
我想让用户选择调整 header 的大小和我应用程序中所有 table 的行文本大小(有很多这样的选项,所以更改 CSS 每一个都不是我的选择),通过滑块,我正在使用 CSS styleSheet 修改我的 table 样式,并且我已将它附加到根目录。
我的TableCss
.table-view .column-header {
-fx-font-size: 14px;
}
我的问题
有什么方法可以从 java(样式表之外)
修改上面样式表中的默认 header 字体大小 (14px)备注
正如我已经提到的,样式表附加到根目录,而不是直接附加到 tables。
我正在使用 JavaFX 16
此解决方案需要 JavaFX 17 使用数据 URL。
调用提供的函数,传入一些 parent 节点,其中包含 table 个您要调整其 headers 大小的节点。
它将删除节点上所有现有的用户样式表,因此不要在应用了现有样式表的节点上调用它。
private void setTableHeaderFontSize(Region parent, int size) {
parent.getStylesheets().setAll(
"""
data:text/css,
.table-view .column-header {
-fx-font-size:
"""
+ size + "px;}"
);
}
示例应用程序
下面的示例将 table 节点传递给 CSS 样式函数,但您无需将其直接应用于 table,您可以将其应用于任何parent 节点,它将应用于节点层次结构中的任何 table children。
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
public class RecordTableViewer extends Application {
public record Person(String last, String first, int age) {}
private final IntegerProperty fontSize = new SimpleIntegerProperty();
@Override
public void start(Stage stage) {
TableView<Person> table = createTable();
populateTable(table);
Pane controls = createControls();
VBox layout = new VBox(
10,
controls,
table
);
layout.setPadding(new Insets(10));
layout.setPrefSize(300, 300);
setTableHeaderFontSize(table, fontSize.intValue());
fontSize.addListener((observable, oldValue, newValue) ->
setTableHeaderFontSize(table, newValue.intValue())
);
stage.setScene(new Scene(layout));
stage.show();
}
private TableView<Person> createTable() {
TableView<Person> table = new TableView<>();
TableColumn<Person, String> lastColumn = new TableColumn<>("Last");
lastColumn.setCellValueFactory(
p -> new SimpleStringProperty(p.getValue().last())
);
TableColumn<Person, String> firstColumn = new TableColumn<>("First");
firstColumn.setCellValueFactory(
p -> new SimpleStringProperty(p.getValue().first())
);
TableColumn<Person, Integer> ageColumn = new TableColumn<>("Age");
ageColumn.setCellValueFactory(
p -> new SimpleIntegerProperty(p.getValue().age()).asObject()
);
ageColumn.setPrefWidth(60);
//noinspection unchecked
table.getColumns().addAll(lastColumn, firstColumn, ageColumn);
return table;
}
private void populateTable(TableView<Person> table) {
table.getItems().setAll(
new Person("Smith", "Justin", 41),
new Person("Smith", "Sheila", 42),
new Person("Morrison", "Paul", 58),
new Person("Tyx", "Kylee", 40),
new Person("Lincoln", "Abraham", 200)
);
}
private HBox createControls() {
Slider fontSizeSlider = new Slider(8, 24, 14);
fontSizeSlider.setMajorTickUnit(2);
fontSizeSlider.setMinorTickCount(0);
fontSizeSlider.setShowTickMarks(true);
fontSize.setValue((int) Math.round(fontSizeSlider.getValue()));
fontSizeSlider.valueProperty().addListener((observable, oldValue, newValue) ->
fontSize.setValue((int) Math.round(newValue.doubleValue()))
);
Label fontSizeLabel = new Label();
fontSizeLabel.textProperty().bind(
fontSize.asString()
);
return new HBox(
10,
new Label("Table header size: "),
fontSizeSlider,
fontSizeLabel
);
}
private void setTableHeaderFontSize(Region parent, int size) {
parent.getStylesheets().setAll("""
data:text/css,
.table-view .column-header {
-fx-font-size:
"""
+ size + "px;}"
);
}
}