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();
}
}
}