JavaFX TextFlow-空文本节点不显示空(从相邻文本中窃取字符)

JavaFX TextFlow-空文本节点不显示空(从相邻文本中窃取字符),java,javafx,textflow,Java,Javafx,Textflow,这里的问题是,中间的文本(蓝色)应该是空的,但由于某些原因不是空的。 该窗口只是一个非常简单的JavaFX应用程序。start方法如下所示: public void start(Stage stage) { Pane main = new Pane(); TextProgress copy = new TextProgress(); main.getChildren().add(copy); Scene scene = new Scene(main, 300,

这里的问题是,中间的
文本
(蓝色)应该是空的,但由于某些原因不是空的。
该窗口只是一个非常简单的JavaFX
应用程序
。start方法如下所示:

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
节点。三个
文本的内容是:“你好”,“空”,“世界”。问题是,正如你在图像中可以看到的那样,“代码”>文本< /代码>中间“偷”了右边的一个字符。
在显示
TextProgress
的代码之前,让我列出一些在处理此代码时发现的东西,以便代码可以理解

  • 这整段代码只是为了说明问题,最初的应用程序基本上是用来显示手工复制文本的过程。左边的
    文本
    将包含所有已键入的单词,中间的
    文本
    将包含当前要键入的单词,右边的
    文本
    将包含尚未键入的文本
  • 此外,对于当前单词的已键入字符和未键入字符,中心
    文本
    再次拆分为
    文本
    。在本例中,“Hello”将是一个已经键入的单词,空的
    文本将是当前单词的键入字符,“World”将是当前单词的非键入字符。(因为在本例中我们没有键入任何内容,所以省略了另一个
    文本
    。)
  • 我没有省略“Hello”的原因是,只有当中心
    Text
    前面有
    文本时才会出现问题(无论是否为空)
  • 另一种防止问题的方法是将当前单词的两个
    文本
    包装在另一个
    文本流
    中<代码>(文本,文本流[文本,文本],文本)
。虽然这似乎解决了问题,但却导致了另一个问题。在键入文本并因此更改
文本的内容时,当前正在键入的行的换行符会不时更改,例如,在键入时,一个长单词被下推到下一行,然后又返回到下一个单词。请注意,即使所有
文本的组合长度始终保持不变,也会发生这种情况。这可能与这个问题有关吗
  • 不同的
    文本之间的唯一区别是颜色。关于上面提到的另一个问题,这是否解释了换行符的变化
  • 问题只出现在当前单词的第一个字符上。一旦中间的
    文本
    (蓝色)不再是空的,一切都如预期的那样
  • 我确保空的
    文本实际上是空的
  • 在显示窗口之前和之后,我为中心的
    文本的
    边界框
    添加了一些打印,这里的宽度属性在显示之前为0,在显示之后为28
  • 如果当前单词的两个
    文本
    包装在另一个
    文本流
    中,则此处的宽度属性将从0更改为-1。是否有办法将空
    文本的宽度设置为-1,而无需附加
    文本流
  • (由于整个类很小,因此不确定此处是只包括
    TextProgress
    类,还是包括整个
    应用程序
    。)


    我很感激任何关于这里发生的事情的线索。同样,这里的主要问题是如何阻止中间的
    文本
    显示相邻
    文本
    中的某些字符

    这就是我猜你在做的事情,从我现在的头部振动的方式来看应该是这样的:)

    您有一个
    TextFlow
    ,其中有3个
    Text
    (或
    Label
    节点
    s,分别为已键入、未键入、当前键入,所有节点都带有初始文本
    “”

    现在,当您键入时,键入和当前键入中的按键将被更新,您将变出下一组单词并将其更新为非键入

    所以它应该可以工作,因为
    Textflow
    只是一个水平的、可包装的节点节点,所以如果你有
    Label
    s或
    Text
    使用不同的油漆,你所要做的就是更新相应的节点
    textProperty()
    ,我想它们会自己包装


    希望这对你有帮助,先生。

    这就是我猜你在做的事情,从我现在的头振动的方式来看应该是这样的:)

    您有一个
    TextFlow
    ,其中有3个
    Text
    (或
    Label
    节点
    s,分别为已键入、未键入、当前键入,所有节点都带有初始文本
    “”

    现在,当您键入时,键入和当前键入中的按键将被更新,您将变出下一组单词并将其更新为非键入

    所以它应该可以工作,因为
    Textflow
    只是一个水平的、可包装的节点节点,所以如果你有
    Label
    s或
    Text
    使用不同的油漆,你所要做的就是更新相应的节点
    textProperty()
    ,我想它们会自己包装


    希望对您有所帮助,先生。

    我不太确定您在这里回答的是什么,这可能是我没有一个更清楚的问题的错。您提到的TextFlow是在什么环境中出现的?键入应用程序至少需要4个文本节点,无论我如何更新内容。盗用字符的问题不仅发生在最初,而且发生在全文中的每一个单词上(在进行过程中)。这个简单的应用程序显然没有包含任何输入进度(因为它与问题无关)。我不确定您在这里回答的是什么,这可能是我没有更清楚的问题的原因。您提到的TextFlow是在什么环境中出现的?打字应用程序
    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();
        }
    }
    }