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
实际上是空的我在显示窗口之前和之后为中心
BoundingBox
的Text
添加了一些打印件,此处的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
(或Label
)Node
,分别是键入的,未键入的,当前类型的,都带有初始文本" "
。
现在,当您键入时,击键会在键入和currenttype中更新,并且您会联想到下一组单词并将其更新为untype。
因此它应该工作,因为Textflow
只是节点的水平可折叠节点,因此,如果您的Label
或Text
具有不同的Paints,那么您要做的就是更新这些相应的节点textProperty()
,并且猜猜他们会自己包装。
希望它对您有帮助。