1

这是窗户的样子

这里的问题是中心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”、“”(空)、“World”。问题是,正如您在图像中看到的Text那样,中间的“偷”了右边的一个字符。

在展示 的代码之前TextProgress,让我列出一些我在玩这个的过程中发现的一些东西,以使代码易于理解。

  • 整个代码只是为了显示问题,原始应用程序基本上是显示手动复制文本的进度。左边Text包含所有已经输入的单词,中间Text是当前要输入的单词,右边Text是尚未输入的文本。
  • 此外,中心Text再次被拆分为Text用于当前单词的已键入字符和未键入字符的 a。在这个例子中,“Hello”是一个已经输入的单词,emptyText是当前单词的输入字符,而“World”是当前单词的未输入字符。(由于我们在此示例中没有输入任何内容,因此Text省略了另一个。)
  • 我没有省略“Hello”的原因是只有Text在中心前面有一个时才会出现问题Text(不管是否为空)。
  • 防止该问题的另一种方法是将Texts当前单词的两个包装在另一个中TextFlow(Text, TextFlow[Text,Text], Text). 虽然这似乎解决了问题,但它导致了不同的问题。在键入文本并因此更改 的内容时Texts,当前正在键入的行的自动换行会不时更改,例如,在键入时将长单词推入下一行,然后在下一个单词上返回再次。请注意,即使 all 的总长度Texts始终保持不变,也会发生这种情况。这可能与这个问题的问题有关?
  • 不同之间的唯一区别Texts是颜色。关于上面提到的另一个问题,这是否解释了换行的变化?
  • 该问题仅发生在当前单词的第一个字符上。一旦中心Text(蓝色)不再为空,一切都如预期的那样。
  • 我确保空Text的实际上是空的
  • 我在显示窗口之前和之后BoundingBox为中心添加了一些打印,这里的宽度属性之前是 0,之后是 ~28。Text
  • 如果Texts当前单词的两个包裹在另一个中TextFlow,则此处的宽度属性从 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

4

1 回答 1

0

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

你有一个TextFlow3 Text(or Label) Nodes,分别是 typed、untyped、currenttyped,都带有初始 text " "

现在,当您键入时,击键在 typed 和 currenttyped 中更新,并且您变出下一组单词并将其更新为 untyped。

所以它应该可以工作,因为Textflow它只是一个水平的、可包装的节点节点,所以如果你有Labels 或Text使用不同的 Paint,你所要做的就是更新这些各自的节点textProperty(),我猜它们会自行包装。

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

于 2016-05-24T03:25:15.193 回答