This is how the window looksJavaFX TextFlow - пустой текстовый узел не отображается пустой (ворует символ из соседнего текста)
Проблема здесь в том, что центр 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
: «Привет», «» (пусто), «Мир». Проблема заключается в том, что, как вы можете видеть на изображении, 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
до и после отображения окна, ширина атрибута здесь 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? Приложению для ввода требуется не менее 4 текстовых узлов, и не имеет значения, как я обновляю содержимое. Проблема кражи персонажа возникает не только изначально, но и для каждого слова из полного текста (при прогрессировании). Это простое приложение, очевидно, не содержит какой-либо последовательности ввода (поскольку это не относится к проблеме). – Caranown