Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno JavaFX - Jak definovat velkost textu v pixelech?

Dobrý den,

Potřebuji definovat velikost textu v pixelech a našel jsem, jak by měl přepočet vypadat

double fontSize= 72.0 * pixelSize / Toolkit.getDefaultToolkit().getScreenResolution();

Bohužel není správný. V příkladu níže mé text cca 95 pixelů

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

[]

Jak to, prosím Vás, správně vypočítat?

Děkuji

Předmět Autor Datum
Jak jsi prisel na to, ze velikost textu = vyska velkych pismenek z fontu? https://scribus.cz/zaklad… nový
MaSo 22.02.2021 07:26
MaSo
Promiňte, špatně jsem se vyjádřil. Chtěl jsem říct, že bych chtěl, aby měla velká písmena tolik pixe… nový
MichalDM 22.02.2021 11:09
MichalDM
No to se právě takhle definovat nedá. Což by ses dozvěděl, kdyby sis přečetl ten článek. nový
Wikan 22.02.2021 11:16
Wikan
A alespoň přibližně by to nešlo? Nepotřebuji nutně přesnou hodnotu, stačí s odchylkou 1-2px. nový
MichalDM 22.02.2021 12:41
MichalDM
Jestli ti chybí 5 px, tak to zvětši zhruba o 5 %. Pokud ale změníš font, tak to zase může být jinak. nový
Wikan 22.02.2021 12:49
Wikan
Měnit font (ke stažení zde) nebudu, ale nechci kód, který bude závislý pouze na jednom rozlišení. Je… nový
MichalDM 24.02.2021 17:51
MichalDM
Zapomněl jsem tuhle otázku uzavřít. Lze to vyřešit tímto kódem. import javafx.scene.Scene; import j… poslední
MichalDM 22.04.2021 17:15
MichalDM

Zapomněl jsem tuhle otázku uzavřít. Lze to vyřešit tímto kódem.

import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextBoundsType;
import javafx.stage.Stage;

public class TextHeightInPixel extends javafx.application.Application {

    @Override
    public void start(Stage stage) {
        var text = new Text("I");
        text.setBoundsType(TextBoundsType.VISUAL);
        text.setFont(Font.loadFont(getClass().getResourceAsStream("GT Pressura Mono Regular Regular.ttf"), 100));
        var pane = new HBox(text);
        text.setFill(Color.BLUE);
        var scene = new Scene(pane, 700, 400);
        setPixelHeight(scene, text, 99);
        stage.setScene(scene);
        stage.show();
    }

    public static void setPixelHeight(Scene scene, Text text, int size) {
        for (var i = size + 1;; i++) {
            text.setStyle("-fx-font-size:" + i + ";");
            var pixelReader = scene.snapshot(null).getPixelReader();
            if (!(pixelReader.getColor(0, size)).equals(pixelReader.getColor(0, size + 1))) {
                break;
            }
        }
    }

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

Funguje to jednoduše. Vložím písmeno I, které je asi nejideálnější, umístím do rohu, nastavím libovolnou barvu a potom zvětšuji text do té doby, než se 99 a 100 pixel (od shora) bude lišit. Je to sice primitivní, ale funguje to.

I přesto děkuji za snahu.

Zpět do poradny Odpovědět na původní otázku Nahoru