我想更改TableView
中文本的字体,但是当我这样尝试时,它没有应用字体,因为它找不到任何节点:
tableView.lookupAll(".table-row-cell").forEach(cell -> {
applyFont(cell, MainFont.LIGHT, FontStyle.SUBHEAD);
});
其中applyFont()
是自定义函数。我认为它与TableView
没有被初始化有关,所以我试图将它包装在Platform.runLater()
中,但这也无效。
但是,唯一有效的方法是将此代码放在监听器中(选择,悬停等):
tableView.hoverProperty().addListener(change -> {
tableView.lookupAll(".table-row-cell").forEach(cell -> {
applyFont(cell, MainFont.LIGHT, FontStyle.SUBHEAD);
});
});
当我现在悬停TableView
字体更改时。但我不明白为什么它不能与Platform.runLater()
合作。
此代码位于我的应用程序中每个屏幕的超类中,并在子屏幕构建后运行,但尚未显示。
我在这里缺少什么?非常感谢任何帮助!
注意:在我的情况下,我无法使用CSS解决方案。
答案 0 :(得分:3)
我发现CSS查找本质上不稳定,我的建议是尽可能避免它们。除非已应用CSS,否则它们将找不到任何节点,这通常发生在第一帧渲染脉冲上。此外,对于此用例,您需要确保已创建表行和单元格。仅仅在Platform.runLater(...)
中包装查找并不能保证这些条件是否得到满足。此外,它们不是类型安全的并且依赖于字符串绑定,因此有许多事情可能会失败而且编译器不会检查它们。
对于您的用例,仅设置表行的样式就足够了。您可以使用rowFactory
直接执行此操作。为了能够在以后更新样式,只需创建一个StringProperty
来保存样式,然后将styleProperty
的{{1}}绑定到此:
TableRow
现在简单地使用有效的CSS样式调用StringProperty style = new SimpleStringProperty();
// ...
table.setRowFatory(tv -> {
TableRow<MyDataType> row = new TableRow<>();
row.styleProperty().bind(style);
return row ;
});
将更新行的样式(以及行包含的所有单元格)。这完全避免了查找的需要。
SSCCE:
style.set(...)
答案 1 :(得分:1)
您想要设置TableView的字体样式。您想为行/单元格设置字体样式。
您可以使用TableView类的方法setStyle()
。使用JavaFX CSS Reference,您可以查看哪些设置可行。所以这是CSS但没有额外的CSS文件,所以你可以以任何方式做到这一点。
Minimal, Complete, and Verifiable example将如下所示:
import java.util.Set;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TableFontStyle extends Application {
@Override
public void start(Stage primaryStage) {
ObservableList<Person> persons
= FXCollections.observableArrayList(
new Person("Sir", "Tobey"),
new Person("Admiral", "von Schneider"),
new Person("Mr.", "Pommeroy"),
new Person("Mr.", "Winterbottom"));
TableView<Person> tableView = new TableView<>(persons);
TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory("firstName"));
TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");
lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));
tableView.getColumns().setAll(firstNameCol, lastNameCol);
tableView.getSelectionModel().clearAndSelect(0);
Button btn = new Button("Change Font Style");
btn.setOnAction((e) -> {
Set<Node> cells = tableView.lookupAll(".table-cell");
cells.forEach((c) -> {
c.setStyle("-fx-font-weight:lighter;-fx-font-style:italic;");
});
});
VBox root = new VBox();
root.getChildren().addAll(tableView, btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Font Table");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
public class Person {
private final StringProperty firstName
= new SimpleStringProperty(this, "firstName");
public void setFirstName(String value) {
firstNameProperty().set(value);
}
public String getFirstName() {
return firstNameProperty().get();
}
public StringProperty firstNameProperty() {
return firstName;
}
private final StringProperty lastName
= new SimpleStringProperty(this, "lastName");
;
public void setLastName(String value) {
lastNameProperty().set(value);
}
public String getLastName() {
return lastNameProperty().get();
}
public StringProperty lastNameProperty() {
return lastName;
}
public Person(String firstName, String lastName) {
this.firstName.set(firstName);
this.lastName.set(lastName);
}
}
}
工作的应用程序将如下所示: