这里的问题是中心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
没有额外的情况下将空的宽度设置为 -1TextFlow
?
(不确定是只包括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
。