2016-05-23 10 views
1

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〜、前である前に、ウィンドウを表示した後、私は中央TextBoundingBoxのためのいくつかのプリントを追加
  • 実際には空である。作ら
  • 現在の単語のための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の文字を表示させないようにする方法です。

答えて

0

これは型なし、それぞれ入力された、私はあなたが3 Text(またはLabel)を持つTextFlowを持っている:)

私の頭は今、振動している途中からは動くはずです、あなたがやっている推測しています何Node秒です、currenttyped、最初のテキストはすべて" "です。

これで、入力した文字列と現在の文字列にキーストロークが更新され、次の単語セットが作成され、untypedに更新されます。

Textflowは、ノードのちょうど水平、巻き付け可能ノードであるので、あなたはLabel Sまたは異なる塗料でTextを持っている場合、あなたがしなければならないすべては更新がそれらのそれぞれのノードtextProperty()ある、と私は、彼らがラップすると思いますので、それは、動作するはずです自分自身で。

あなたのお役に立てば幸いです。

+0

私は本当にあなたがここで答えているのか分かりません。これはもっと明確な質問がないのが私のせいかもしれません。あなたが言及しているTextFlowはどのような環境ですか?入力アプリケーションには少なくとも4つのTextノードが必要ですが、内容を更新する方法は関係ありません。文字を盗む問題は、当初は発生するのではなく、全文のすべての単語(進行中)で発生します。このシンプルなアプリケーションには明らかに(それが問題に関係していないので)明らかにタイピングの進展はありません。 – Caranown

関連する問題