Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有CSS的情况下更改列标题的字体_Java_Javafx - Fatal编程技术网

Java 如何在没有CSS的情况下更改列标题的字体

Java 如何在没有CSS的情况下更改列标题的字体,java,javafx,Java,Javafx,我希望能够在不使用CSS的情况下更改JavaFX的TableView的列标题的字体。我在网上做了很多搜索,所有的解决方案似乎都只使用CSS。我想更改的字体是自定义字体,在cssforjavafx中加载自定义字体会出现一个错误,在搜索了数十个链接后,我似乎无法修复这个错误 我尝试的CSS方法是 @font-face { font-family: '8bitoperator'; src: url('assets/8bitoperator.ttf'); } .table-view .

我希望能够在不使用CSS的情况下更改JavaFX的TableView的列标题的字体。我在网上做了很多搜索,所有的解决方案似乎都只使用CSS。我想更改的字体是自定义字体,在cssforjavafx中加载自定义字体会出现一个错误,在搜索了数十个链接后,我似乎无法修复这个错误

我尝试的CSS方法是

@font-face {
    font-family: '8bitoperator';
    src: url('assets/8bitoperator.ttf');
}

.table-view .column-header.foo .label {
    -fx-text-fill: white;
    -fx-font-size: 0.13%; /* arbitrary value */
    -fx-font-family: '8bitoperator';
}
这会遇到
loadStylesheetUnPrivileged
错误。我程序中的所有其他样式都是通过Javafx而不是CSS实现的,所以我希望能够保持这一点


非常感谢您的帮助。

我不确定您当前的样式表问题。但是,如果您正在寻找一种以编程方式更新列标题字体的方法,下面是一种方法。话虽如此,也可以有许多其他方法

总体思路是:您想要的节点不能通过任何通用API访问。因此,我们在完全渲染表视图时查找节点。完全渲染节点时,节点的“needsLayout”属性将变为false。因此,如果您依赖于该属性和一个额外的属性来避免多次运行,那么您可以使用“lookupAll”方法获得您的需求

导入javafx.animation.AnimationTimer;
导入javafx.application.application;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.Priority;
导入javafx.scene.layout.Region;
导入javafx.scene.layout.VBox;
导入javafx.scene.text.Font;
导入javafx.stage.stage;
导入java.util.concurrent.AtomicBoolean;
公共类ColumnHeaderCustomFontDemo扩展了应用程序{
布尔fontsLoaded=false;
int i=1;
@凌驾
public void start(Stage primaryStage)引发异常{
TableView TableView=新建TableView();
TableColumn fnCol=新的TableColumn(“名字”);
fnCol.setPrefWidth(120);
fnCol.setId(“第一列”);
TableColumn lnCol=新的TableColumn(“姓氏”);
lnCol.setId(“最后一列”);
lnCol.setVisible(假);
TableColumn cityCol=新的TableColumn(“城市”);
cityCol.setId(“cityColumn”);
tableView.getColumns().addAll(fnCol、lnCol、cityCol);
tableView.needsLayoutProperty().addListener((obs,old,needsLayout)->{
如果(!needsLayout){
AtomicBoolean updateLayout=新的AtomicBoolean();
tableView.lookupAll(“.column header”).stream().map(节点->(区域)节点).forEach(列->{
if(column.getProperties().get(“fontLoaded”)==null){
开关(column.getId()){
案例“第一列”:
更新(第20栏“Calibri”);
updateLayout.set(true);
打破
案例“lastColumn”:
更新(第10栏“Verdana”);
updateLayout.set(true);
打破
案例“newColumn”:
更新(第25栏“Verdana”);
updateLayout.set(true);
打破
}
column.getProperties().put(“fontLoaded”,true);
}
});
if(updateLayout.get()){
//在下一个脉冲中只执行一次的计时器。
新的AnimationTimer(){
整数计数=0;
@凌驾
公共无效句柄(长){
如果(计数>1){
tableView.requestLayout();
停止();
}
计数++;
}
}.start();
}
}
});
复选框showLastColumn=新复选框(“显示LastName列”);
showLastColumn.selectedProperty().addListener((obs,old,val)->lnCol.setVisible(val));
按钮添加列=新按钮(“添加列”);
addColumn.setOnAction(e->{
TableColumn newCol=新TableColumn(“列”+i++);
newCol.setId(“newColumn”);
tableView.getColumns().add(newCol);
});
VBox root=新的VBox();
根起搏(10);
根。设置填充(新插图(10));
root.getChildren().addAll(showLastColumn、addColumn、tableView);
setVgrow(tableView,Priority.ALWAYS);
场景sc=新场景(根,500500);
初生阶段:西新统(sc);
setTitle(“ColumnHeader自定义字体”);
primaryStage.show();
}
私有void updateFont(区域列、字符串fontName、int fontSize){
column.lookupAll(“.label”).stream();
}
班主任{
//TableView项目
}
}
hmm。。当你的目标是不使用css时,为什么要谈论(几乎完全)css并使用css标签呢?请编辑以清理问题,并描述您想要解决的问题。好奇的是,在代码中加载自定义字体是否有效?如果是这样的话,也许值得研究一下(包括在这里发布一个有重点的问题,并加上:)来了解哪里出了问题——采用css的方式是最干净的方法。或者-如果成功加载-您可以将字体样式设置为列,标题的外观(又名:TableColumnHeader)应该能够抓取它是的,可能:)想知道,但是:如果问题是无法访问的自定义字体,尝试设置它不会有帮助,还是会有帮助?您可能会提到,这不包括添加(无论是新的还是隐藏后再次可见)列。自定义表格列
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

import java.util.concurrent.atomic.AtomicBoolean;

public class ColumnHeaderCustomFontDemo extends Application {
    boolean fontsLoaded = false;

    int i = 1;

    @Override
    public void start(Stage primaryStage) throws Exception {
        TableView<Person> tableView = new TableView<>();
        TableColumn<Person, String> fnCol = new TableColumn<>("First Name");
        fnCol.setPrefWidth(120);
        fnCol.setId("firstColumn");
        TableColumn<Person, String> lnCol = new TableColumn<>("Last Name");
        lnCol.setId("lastColumn");
        lnCol.setVisible(false);
        TableColumn<Person, String> cityCol = new TableColumn<>("City");
        cityCol.setId("cityColumn");
        tableView.getColumns().addAll(fnCol, lnCol, cityCol);

        tableView.needsLayoutProperty().addListener((obs, old, needsLayout) -> {
            if (!needsLayout) {
                AtomicBoolean updateLayout = new AtomicBoolean();
                tableView.lookupAll(".column-header").stream().map(node -> (Region) node).forEach(column -> {
                    if (column.getProperties().get("fontLoaded") == null) {
                        switch (column.getId()) {
                            case "firstColumn":
                                updateFont(column, "Calibri", 20);
                                updateLayout.set(true);
                                break;
                            case "lastColumn":
                                updateFont(column, "Verdana", 10);
                                updateLayout.set(true);
                                break;
                            case "newColumn":
                                updateFont(column, "Verdana", 25);
                                updateLayout.set(true);
                                break;
                        }
                        column.getProperties().put("fontLoaded", true);
                    }
                });
                if (updateLayout.get()) {
                    // A timer to execute only once in the next pulse.
                    new AnimationTimer(){
                        int count = 0;
                        @Override
                        public void handle(long now) {
                            if(count>1){
                               tableView.requestLayout();
                                stop();
                            }
                            count++;
                        }
                    }.start();
                }
            }
        });

        CheckBox showLastColumn = new CheckBox("Show LastName column");
        showLastColumn.selectedProperty().addListener((obs, old, val) -> lnCol.setVisible(val));
        Button addColumn = new Button("Add Column");
        addColumn.setOnAction(e -> {
            TableColumn<Person, String> newCol = new TableColumn<>("Column " + i++);
            newCol.setId("newColumn");
            tableView.getColumns().add(newCol);
        });
        VBox root = new VBox();
        root.setSpacing(10);
        root.setPadding(new Insets(10));
        root.getChildren().addAll(showLastColumn, addColumn, tableView);
        VBox.setVgrow(tableView, Priority.ALWAYS);

        Scene sc = new Scene(root, 500, 500);
        primaryStage.setScene(sc);
        primaryStage.setTitle("ColumnHeader Custom Font");
        primaryStage.show();

    }

    private void updateFont(Region column, String fontName, int fontSize) {
        column.lookupAll(".label").stream().map(node -> (Label) node).forEach(label -> label.setFont(new Font(fontName, fontSize)));
    }

    class Person {
        // TableView item
    }
}