ここでの問題は、中央Text
(青) が空である必要があることですが、何らかの理由でそうではありません。ウィンドウは非常に単純な JavaFXApplication
です。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
に 3 つのText
ノードを持つカスタム クラスです。3 つの内容は、Texts
「Hello」、「」(空)、「World」です。問題は、画像でわかるようにText
、真ん中のキャラクターが右側のキャラクターから「盗んだ」ことです。
のコードを示す前にTextProgress
、コードを理解しやすくするために、これをいじっているときに見つけたいくつかのことを挙げておきましょう。
- このコード全体は問題を示すためのものであり、元のアプリケーションは基本的に、テキストを手動でコピーする進行状況を表示するものでした。左側
Text
には既に入力されたすべての単語が含まれ、中央Text
には現在入力する単語が含まれ、右側Text
にはまだ入力されていないテキストが含まれます。 - さらに、中央は、現在の単語のタイプされた文字とタイプされていない文字の
Text
にもう一度分割されました。Text
この例では、"Hello" は既に入力された単語、空Text
は現在の単語の入力された文字、"World" は現在の単語の入力されていない文字になります。(この例では何も入力していないため、もう一方Text
は省略されています。) - 「こんにちは」を除外しなかった理由は、問題が
Text
中心の前にある場合にのみ発生するためですText
(空かどうかは関係ありません)。 Texts
この問題を回避する別の方法は、現在の単語の 2 つを別の でラップすることTextFlow
です。(Text, TextFlow[Text,Text], Text)
. これで問題が解決したように見えますが、別の問題が発生します。テキストを入力して の内容を変更すると、Texts
現在入力されている行のワード ラップが時々変更されます。たとえば、入力中に長い単語が次の行に押し込まれ、次の単語に戻ります。また。これは、すべての結合された長さがTexts
常に同じままであっても発生することに注意してください。これは、この質問の問題に関連している可能性がありますか?- 異なる間の唯一の違い
Texts
は色です。上記の他の問題に関して、これはワードラップの変更を説明していますか? - この問題は、現在の単語の最初の文字でのみ発生しました。中央
Text
(青) が空でなくなると、すべてが期待どおりになります。 Text
空が実際に空であることを確認しました- ウィンドウを表示する前後に
BoundingBox
中央の にいくつかのプリントを追加しました。ここでの幅属性は、前は 0、後は ~28 です。Text
- 現在の単語の 2 つ
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
.