This is how the window looksのJavaFXのTextFlow - 空で表示されていない空のテキストノード(隣接するテキストから文字を盗ん)
は、ここでの問題は、中央Text
(青)が空でなければならないことですが、いくつかの理由ではありません。 このウィンドウは非常に単純なJavaFX Application
です。 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
はそれで3つのText
のノードと基本的にTextFlow
あるカスタムクラスです。 Texts
の3つの内容は、 "Hello"、 ""(空)、 "World"です。問題は、あなたがイメージで見ることができるように、真ん中のText
が右側の文字を「盗んだ」ということです。
TextProgress
のコードを表示する前に、コードを理解しやすくするために、これを試しながら見つけたことをいくつか挙げておきます。
- このコード全体が問題を示すに過ぎません。元のアプリケーションは、基本的に手作業でテキストのコピーの進行状況を表示するものでした。左の
Text
には、すでに入力されたすべての単語が入力されます。Text
は入力する現在の単語、右にはText
のテキストが入力されます。 - さらに、中心
Text
は、現在の単語のタイプされた文字とタイプされていない文字のために、もう一度分割されました(Text
)。この例では、 "Hello"はすでに型付きの単語になり、空のText
は現在の単語の型付き文字になり、 "World"は現在の単語の型なしの文字になります。 (この例では何も入力していないので、他のText
は除外されました) - 「Hello」を除外しない理由は、
Text
がセンターの前にある場合にのみ発生するということです。Text
(空であるかどうかは関係ありません)。 - この問題を回避するもう1つの方法は、別の
TextFlow
に現在の単語の2つのTexts
をラップすることです。(Text, TextFlow[Text,Text], Text)
。これは問題を解決するように見えますが、別の問題を引き起こします。テキストの入力中にTexts
の内容を変更している間に、現在入力されている行の単語が変更される。長い単語は入力中に次の行にプッシュダウンされ、次に次の単語に再び移動します。これはすべてのTexts
の長さの組み合わせが常に同じままであっても発生します。これはこの質問の問題に関連している可能性がありますか? - 異なる
Texts
の唯一の違いは色です。上記の他の問題に関しては、これは言い回しの変化について説明していますか? - 問題は、現在の単語の最初の文字でのみ発生しました。センター
Text
(青色)がもう空でないと、すべてが期待どおりになります。私は確かに空Text
が、ここでwidth属性は、その後0 28〜、前である前に、ウィンドウを表示した後、私は中央Text
のBoundingBox
のためのいくつかのプリントを追加 - 実際には空である。作ら
- 現在の単語のための2つ
Texts
が別のTextFlow
に包まれている場合は、ここでのwidth属性は、0から-1に変更します。追加TextFlow
せずに-1空Text
の幅を設定する方法はありますか?
(クラス全体が小さいので、ちょうどここ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つのTextノードが必要ですが、内容を更新する方法は関係ありません。文字を盗む問題は、当初は発生するのではなく、全文のすべての単語(進行中)で発生します。このシンプルなアプリケーションには明らかに(それが問題に関係していないので)明らかにタイピングの進展はありません。 – Caranown