初始化

时间:2015-09-09 11:42:55

标签: java fonts javafx tableview

我想更改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解决方案。

2 个答案:

答案 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文件,所以你可以以任何方式做到这一点。

更改TableView

单元格的字体样式

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);
    }
  }
}

工作的应用程序将如下所示:

App