Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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 正确设置文本大小(以像素为单位)_Java_Javafx_Pixel_Font Size - Fatal编程技术网

Java 正确设置文本大小(以像素为单位)

Java 正确设置文本大小(以像素为单位),java,javafx,pixel,font-size,Java,Javafx,Pixel,Font Size,我无法设置文本大小。虽然我已经找到了一种计算方法,但计算结果仍然不准确,如本例所示 import java.awt.Toolkit; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.scene.text.Font; import javafx.scene.te

我无法设置文本大小。虽然我已经找到了一种计算方法,但计算结果仍然不准确,如本例所示

import java.awt.Toolkit;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class TextHeight extends javafx.application.Application  {

    @Override
    public void start(Stage stage) {
        var text = new Text("EXAMPLE");
        var fontSize = 100 * Toolkit.getDefaultToolkit().getScreenResolution() / 72.0;
        text.setFont(Font.loadFont(getClass().getResourceAsStream("GT Pressura Mono Regular Regular.ttf"), fontSize));
        text.setFill(Color.BLUE);
        text.setX(0);
        text.setY(100); 
        var pane = new Pane(text, new Rectangle(500, 0, 10, 100));
        stage.setScene(new Scene(pane, 600, 120));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
我现在根本不想解决文本的位置问题。只是字体的高度不是100px,而是94px左右

尺寸计算有问题吗?还是与字体有关?是我下载的还是其他地方出了问题

请帮忙


谢谢你

正如在一篇评论中指出的,该评论链接到了一个关于字体度量的真正优秀的讨论,字体的大小不是大写字母的高度

也许我有兴趣看到其他建议实现您想要的最好方法是定义一个自定义区域来容纳文本节点,它覆盖layoutChildren,以便调整字体大小,使高度适合区域大小

几个实施说明:

Text.setBoundsType确定如何测量文本的边界。默认值是逻辑的,它基于字体的度量,而不是呈现的实际文本。我想你想要的是视觉界限。 这种实施方式的内容偏向于纵向;这意味着它的宽度取决于它的高度。已知高度后,将计算字体大小,并计算首选宽度作为文本宽度。 这在某种程度上是有限的,没有多行文字等,但如果你想要更复杂的东西,应该给你一个起点

public class TextPane extends Region {
    private final Text text ;
    public TextPane(Text text) {
        this.text = text ;
        getChildren().add(text);
    }
    
    @Override
    protected void layoutChildren() {
        adjustFontSize(getHeight());
        text.setY(getHeight());
        text.setX(0);
    }

    private void adjustFontSize(double height) {
        double textHeight = text.getBoundsInLocal().getHeight();
        if (Math.abs(height - textHeight) > 1) {
            Font currentFont = text.getFont() ;
            double fontSize = currentFont.getSize() ;
            text.setFont(Font.font(currentFont.getFamily(), height * fontSize / textHeight));
        }
    }
    
    @Override
    protected double computePrefWidth(double height) {
        adjustFontSize(height);
        return text.getBoundsInLocal().getWidth();
    }
    
    @Override
    public Orientation getContentBias() {
        return Orientation.VERTICAL;
    }
}
下面是一个示例,通过将文本窗格的高度固定为100,它基本上实现了您希望执行的操作:

如果文本具有带下降的图示符,例如,如果将“示例”更改为“示例”,则p下降到基线以下,则文本的总高度将包括下降:

下面是一个使用文本窗格作为根节点的示例,因此它始终与场景大小相同。更改窗口大小将导致文本自动更新以垂直填充场景:

public class TextHeight extends javafx.application.Application  {

    @Override
    public void start(Stage stage) {
        Text text = new Text("Example");
        text.setBoundsType(TextBoundsType.VISUAL);
        text.setTextOrigin(VPos.BOTTOM);
        text.setFill(Color.BLUE);
        TextPane textPane = new TextPane(text);
        textPane.setPrefHeight(100);
        stage.setScene(new Scene(textPane));
        stage.show();
    }

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

正如在一篇评论中所指出的那样,一种字体的大小并不是其大写字母的高度,该评论链接到了一个关于字体度量的真正优秀的讨论

也许我有兴趣看到其他建议实现您想要的最好方法是定义一个自定义区域来容纳文本节点,它覆盖layoutChildren,以便调整字体大小,使高度适合区域大小

几个实施说明:

Text.setBoundsType确定如何测量文本的边界。默认值是逻辑的,它基于字体的度量,而不是呈现的实际文本。我想你想要的是视觉界限。 这种实施方式的内容偏向于纵向;这意味着它的宽度取决于它的高度。已知高度后,将计算字体大小,并计算首选宽度作为文本宽度。 这在某种程度上是有限的,没有多行文字等,但如果你想要更复杂的东西,应该给你一个起点

public class TextPane extends Region {
    private final Text text ;
    public TextPane(Text text) {
        this.text = text ;
        getChildren().add(text);
    }
    
    @Override
    protected void layoutChildren() {
        adjustFontSize(getHeight());
        text.setY(getHeight());
        text.setX(0);
    }

    private void adjustFontSize(double height) {
        double textHeight = text.getBoundsInLocal().getHeight();
        if (Math.abs(height - textHeight) > 1) {
            Font currentFont = text.getFont() ;
            double fontSize = currentFont.getSize() ;
            text.setFont(Font.font(currentFont.getFamily(), height * fontSize / textHeight));
        }
    }
    
    @Override
    protected double computePrefWidth(double height) {
        adjustFontSize(height);
        return text.getBoundsInLocal().getWidth();
    }
    
    @Override
    public Orientation getContentBias() {
        return Orientation.VERTICAL;
    }
}
下面是一个示例,通过将文本窗格的高度固定为100,它基本上实现了您希望执行的操作:

如果文本具有带下降的图示符,例如,如果将“示例”更改为“示例”,则p下降到基线以下,则文本的总高度将包括下降:

下面是一个使用文本窗格作为根节点的示例,因此它始终与场景大小相同。更改窗口大小将导致文本自动更新以垂直填充场景:

public class TextHeight extends javafx.application.Application  {

    @Override
    public void start(Stage stage) {
        Text text = new Text("Example");
        text.setBoundsType(TextBoundsType.VISUAL);
        text.setTextOrigin(VPos.BOTTOM);
        text.setFill(Color.BLUE);
        TextPane textPane = new TextPane(text);
        textPane.setPrefHeight(100);
        stage.setScene(new Scene(textPane));
        stage.show();
    }

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

您错误地认为点大小是大写字母的高度。看,你错误地认为点的大小是大写字母的高度。看,这正是我想要的。非常感谢。这正是我想要的。非常感谢你。