如何在javaFX的文本字段中制作动态字体

问题描述

我创建了一个JavaFX代码,该代码生成3x3矩阵,其随机数为1到9。 我希望代码在每次更改窗口大小时都能更改文本大小,我希望ti随窗口像素动态变化。我听说过使用监听器,但是我不知道如何使用它们。

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        int size = 500;
        GridPane root = new GridPane();

        for (int y = 0; y < 3; y++) {
            for (int x = 0; x < 3; x++) {
                
                int num = (int) (Math.random() * 9) + 1;
                TextField tf = new TextField();
                tf.setFont(Font.font("Ariel",FontWeight.BOLD,50));
                tf.setPrefheight(size);
                tf.setPrefWidth(size);
                tf.setAlignment(Pos.CENTER);
                tf.setEditable(false);
                tf.setText(""+num);
                

                root.setRowIndex(tf,y);
                root.setColumnIndex(tf,x);
                root.getChildren().add(tf);
            }
        }
        Scene scene = new Scene(root,size,size);
        primaryStage.setTitle("Random Binary Matrix (JavaFX)");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

解决方法

您可以在Gridpane上的widthProperty()heightProperty()中添加一个侦听器。对于您的情况,您可以尝试执行以下操作:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        int size = 500;
        GridPane root = new GridPane();

        for (int y = 0; y < 3; y++) {
            for (int x = 0; x < 3; x++) {
                
                int num = (int) (Math.random() * 9) + 1;
                TextField tf = new TextField();
                tf.setFont(Font.font("Ariel",FontWeight.BOLD,50));
                tf.setPrefHeight(size);
                tf.setPrefWidth(size);
                tf.setAlignment(Pos.CENTER);
                tf.setEditable(false);
                tf.setText(""+num);
                

                root.setRowIndex(tf,y);
                root.setColumnIndex(tf,x);
                root.getChildren().add(tf);

                ChangeListener listener=(observable,oldValue,newValue) -> {
                    changeFontSize(root,tf);
                };
                root.heightProperty().addListener(listener);
                root.widthProperty().addListener(listener);
            }
        }
        Scene scene = new Scene(root,size,size);
        primaryStage.setTitle("Random Binary Matrix (JavaFX)");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void changeFontSize(GridPane root,TextField tf) {
        double min = Math.min(root.getWidth(),root.getHeight());
        tf.setFont(Font.font("Ariel",min/10));
    }

    public static void main(String[] args) {
        launch(args);
    }
}