1

窓はこんな感じ

ここでの問題は、中央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.

4

1 に答える 1