This is how the window looks

这里的问题是中心Text(蓝色)应该为空,但出于某些原因却不是。
该窗口只是一个非常简单的JavaFX Application。启动方法如下所示:

public void start(Stage stage) {
    Pane main = new Pane();
    TextProgress copy = new TextProgress();
    main.getChildren().add(copy);

    Scene scene = new Scene(main, 300, 200);
    stage.setTitle("Test");
    stage.setScene(scene);
    stage.show();
}


TextProgress是一个自定义类,基本上是一个带有三个TextFlow节点的Text。三个Texts的内容是:“ Hello”,“”(空),“世界”。从图像中可以看到,问题是中间的Text从右边的字符“偷”了一个字符。

在显示TextProgress的代码之前,让我列出一些在尝试使用此代码时发现的内容,以使代码易于理解。


整个代码只是用来显示问题,原始应用程序基本上是用来显示手动复制文本的进度的。左边的Text包含所有已经键入的单词,中间的Text要键入的当前单词,右边的Text仍要键入的文本。
此外,中心Text再次被拆分为Text,用于当前单词的键入和未键入字符。在此示例中,“ Hello”将是已经键入的单词,空的Text将是当前单词的键入字符,而“ World”将是当前单词的未键入字符。 (由于在此示例中我们未键入任何内容,因此省略了另一个Text。)
我没有遗漏“ Hello”的原因是,仅当中心Text前面有一个Text时才出现此问题(无论是否为空)。
防止该问题的另一种方法是将当前单词的两个Texts包装在另一个TextFlow中。 (Text, TextFlow[Text,Text], Text)。尽管这似乎可以解决问题,但它会导致问题有所不同。在键入文本并因此更改Texts的内容时,当前正在键入的行的自动换行有时会更改,例如长字在键入时会被向下推到下一行,然后再次回到下一个字。请注意,即使所有Texts的组合长度始终保持不变,也会发生这种情况。这可能与这个问题有关吗?
不同的Texts之间唯一的区别是颜色。关于上述其他问题,这是否解释了自动换行?
仅在当前单词的第一个字符上出现此问题。一旦中心Text(蓝色)不再为空,则一切都按预期进行。
我确保空的Text实际上是空的
我在显示窗口之前和之后为中心BoundingBoxText添加了一些打印件,此处的width属性之前为0,之后为〜28。
如果将当前单词的两个Texts换成另一个TextFlow,则width属性在此从0变为-1。有没有一种方法可以将空白Text的宽度设置为-1而无需附加的TextFlow


(由于整个类很小,因此不确定是此处仅包含TextProgress类还是整个Application。)

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class Window extends Application {

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

@Override
public void start(Stage stage) {
    Pane main = new Pane();
    TextProgress copy = new TextProgress();
    main.getChildren().add(copy);

    Scene scene = new Scene(main, 300, 200);
    stage.setTitle("Test");
    stage.setScene(scene);
    stage.show();
}

private static class TextProgress extends TextFlow {

    private Text typed;
    private TextFlow current;
    private Text currentTyped;
    private Text currentUntyped;

    public TextProgress()
    {
        double size = 30;
        boolean wrap = false;

        typed = new Text();
        typed.setFont(Font.font(size));
        typed.setFill(Color.ORANGERED);
        typed.setText("Hello ");

        currentTyped = new Text();
        currentTyped.setFont(Font.font(size));
        currentTyped.setFill(Color.DEEPSKYBLUE);
        currentTyped.setText("");
        printDelayed(1000);

        currentUntyped = new Text();
        currentUntyped.setFont(Font.font(size));
        currentUntyped.setFill(Color.MEDIUMAQUAMARINE);
        currentUntyped.setText("World");

        if (wrap) {
            current = new TextFlow();
            current.getChildren().addAll(currentTyped, currentUntyped);
            this.getChildren().addAll(typed, current);
        } else {
            this.getChildren().addAll(typed, currentTyped, currentUntyped);
        }
    }

    private void printDelayed(long delay) {
        System.out.println(currentTyped.getLayoutBounds());
        new Thread(() -> {
            try {
                Thread.sleep(delay);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(currentTyped.getLayoutBounds());
        }).start();
    }
}
}


我感谢有关这里发生的任何线索。同样,这里的主要问题是如何阻止中心Text显示相邻Text中的某些字符。

最佳答案

这就是我想你正在做的事情,应该可以从我的头现在的振动方式中起作用:)

您有一个TextFlow,其中有3个Text(或LabelNode,分别是键入的,未键入的,当前类型的,都带有初始文本" "

现在,当您键入时,击键会在键入和currenttype中更新,并且您会联想到下一组单词并将其更新为untype。

因此它应该工作,因为Textflow只是节点的水平可折叠节点,因此,如果您的LabelText具有不同的Paints,那么您要做的就是更新这些相应的节点textProperty(),并且猜猜他们会自己包装。

希望它对您有帮助。

08-05 17:22