【问题标题】:Set font in javafx在 javafx 中设置字体
【发布时间】:2012-04-26 04:49:25
【问题描述】:

如何在 java fx 的表格视图中将字体设置为列。我有一个包含 3 列的表格,我想为每一列设置不同的字体。另外,是否可以在运行时更改字体。请提供一些示例代码。

【问题讨论】:

    标签: javafx


    【解决方案1】:

    更改表格列样式:

    您应该使用TableColumn#setCellFactory() 来自定义单元格项目渲染。
    例如,像这样的数据模型Person class:

    // init code vs..
    TableColumn firstNameCol = new TableColumn("First Name");
    firstNameCol.setMinWidth(100);
    firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
    firstNameCol.setCellFactory(getCustomCellFactory("green"));
    
    TableColumn lastNameCol = new TableColumn("Last Name");
    lastNameCol.setMinWidth(100);
    lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
    lastNameCol.setCellFactory(getCustomCellFactory("red"));
    
    table.setItems(data);
    table.getColumns().addAll(firstNameCol, lastNameCol);
    
    // scene create code vs..
    

    以及常见的getCustomCellFactory()方法:

    private Callback<TableColumn<Person, String>, TableCell<Person, String>> getCustomCellFactory(final String color) {
            return new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
    
                @Override
                public TableCell<Person, String> call(TableColumn<Person, String> param) {
                    TableCell<Person, String> cell = new TableCell<Person, String>() {
    
                        @Override
                        public void updateItem(final String item, boolean empty) {
                            if (item != null) {
                                setText(item);
                                setStyle("-fx-text-fill: " + color + ";");
                            }
                        }
                    };
                    return cell;
                }
            };
        }
    

    更改表格列标题样式:

    TableView 与 JavaFX 的其他控件一样,使用与 jfxrt.jar 捆绑在一起的名为 caspian.css 的内置样式表。请参阅answer of "JavaFX 2 and CSS classes"
    要更改列字体样式,您可以覆盖默认样式或对其进行自定义:
    覆盖:

    .table-view .column-header{
        -fx-text-fill: -fx-selection-bar-text;
        -fx-font-size: 16;
        -fx-font-family: "Arial";
    }
    

    定制:

    #my-custom .table-view .column-header {
        -fx-text-fill: red;
        -fx-font-size: 26;
        -fx-font-family: "Arial";
    }
    

    覆盖应用中所有TableViews 的效果。因此,如果您更喜欢自定义,那么一旦您定义了多个样式,您就可以在运行时将自定义样式应用于任何 tableview,

    myTableView.setId("my-custom");
    ...
    // Apply another style at runtime
    myTableView.setId("my-custom2");
    

    要了解如何定义样式表文件并将其加载到应用程序,请查看post of "JavaFX How to set scene background image"

    但是,我认为将不同的样式应用于不同的列需要更多的努力。

    【讨论】:

    • 感谢您的回复。这很有帮助。上述样式适用于表格的所有列标题。是否可以申请每列。在您的示例中, .table-view .column-header{ } 适用于所有列标题。我的问题是指定第 1 列使用哪种样式(语法)使用此样式 1,第 2 列使用样式 2...。
    • 我完全误解了你的问题,我很抱歉:)。同时,我假设您已经完成了,但我编辑了我的答案以供将来参考。
    • JavaFX 的当前默认 CSS 样式是从 JavaFX 8 开始的 modena.css,而不是 caspian.css
    【解决方案2】:

    您可以使用 fxml 或 css 文件来设置字体颜色......

     # .mainFxmlClass {
     -fx-font-family:nyala,Tahoma,Arial,Helvetica,sans-serif;   
     -fx-font-size:1.13em;  
     }
    
     .label{
     -fx-font-size:1.3em;
      }
    

    并在 fxml 文件中调用和使用 .lable 或 .mainFxmlClass

    【讨论】:

      【解决方案3】:

      什么样式(语法)指定第 1 列使用此样式 1,第 2 列使用样式 2

      Supply a custom cell factory 提供 cells,您已将在 css 中定义的样式类应用到该 cells 上。链接文档包含的示例应该为您提供足够的信息来实现这一目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        • 2015-08-12
        • 1970-01-01
        • 2020-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多