Как исправить искаженный текст с небольшим размером шрифта в JavaFX? - PullRequest
0 голосов
/ 29 января 2019

Я создаю небольшое приложение с JavaFX для визуализации плат.Приложение включает в себя возможность масштабирования и сдвига.Когда я отображаю небольшие тексты, они искажаются, как вы можете видеть на скриншотах ниже.Только когда я увеличил изображение до достаточной глубины, текст снова будет отображаться правильно.У кого-нибудь есть решение этой проблемы?Я включил пример кода, из которого сделаны снимки экрана.

@Override
public void start(Stage primaryStage) {
    Pane root = new Pane();
    addMouseEventHandler(root);

    Pane pane1 = new Pane();
    Text text1 = new Text(400, 400, "Text 1");
    text1.setFont(new Font(5));
    pane1.getChildren().addAll(text1);
    root.getChildren().add(pane1);

    primaryStage.setTitle("Text scaling problem");
    primaryStage.setScene(new Scene(root, 800, 800));
    primaryStage.show();
}

private void addMouseEventHandler(Pane root) {
    // add scroll handling to zoom in and out
    root.setOnScroll((event) ->
    {
        double factor = event.getDeltaY() > 0 ? 1.1 : 0.9;
        root.setScaleX(root.getScaleX() * factor);
        root.setScaleY(root.getScaleY() * factor);
    });

    // add drag handling
    root.setOnMousePressed((mouseEvent) ->
    {
        startMouseX = mouseEvent.getSceneX();
        startMouseY = mouseEvent.getSceneY();

        startTranslationX = root.getTranslateX();
        startTranslationY = root.getTranslateY();
    });

    root.setOnMouseDragged((mouseEvent) ->
    {
        double movedX = startMouseX - mouseEvent.getSceneX();
        double movedY = startMouseY - mouseEvent.getSceneY();

        double transX = startTranslationX - movedX;
        double transY = startTranslationY - movedY;

        root.setTranslateX(transX);
        root.setTranslateY(transY);
    });
}

правильный текст против искаженный текст

правильный текст прокручивается одинбольше шага, чем искаженный.

1 Ответ

0 голосов
/ 29 января 2019

Я не уверен, что можно что-либо сделать с масштабированием текста внутри текстового узла.но если вы разделите символы в разных текстовых узлах, он сохранит свою форму.Вы можете попробовать Canvas и рисовать вручную с помощью GraphicsContext2D.

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class DistortedText extends Application{

    private double startMouseX, startMouseY;
    private double startTranslationX, startTranslationY;

    @Override
    public void start(Stage primaryStage) {
        HBox box = new HBox(new Text("T"),new Text("e"),new Text("x"),new Text("T"),new Text(" "),new Text("1"));

        Pane root = new Pane(box);
        addMouseEventHandler(root,box);

        primaryStage.setTitle("Text scaling problem");
        primaryStage.setScene(new Scene(root, 800, 800));
        primaryStage.show();
    }

    private void addMouseEventHandler( Pane container, Node node) {
        // add scroll handling to zoom in and out
        container.setOnScroll((event) ->
        {
            double factor = event.getDeltaY() > 0 ? 1.1 : 0.9;
            node.setScaleX(node.getScaleX() * factor);
            node.setScaleY(node.getScaleY() * factor);
        });

        // add drag handling
        container.setOnMousePressed((mouseEvent) ->
        {
            startMouseX = mouseEvent.getX();
            startMouseY = mouseEvent.getY();

            startTranslationX = node.getTranslateX();
            startTranslationY = node.getTranslateY();
        });

        container.setOnMouseDragged((mouseEvent) ->
        {
            double movedX = startMouseX - mouseEvent.getX();
            double movedY = startMouseY - mouseEvent.getY();

            double transX = startTranslationX - movedX;
            double transY = startTranslationY - movedY;

            node.setTranslateX(transX);
            node.setTranslateY(transY);
        });
    }

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