2013-02-26 2 views
5

私はListViewオブジェクトを持っています。私は私のサーバーのためのコンソールウィンドウの一種としてこれを使用しています。そのようなボックスにカラー化されたテキストを表示することが私が考えることができる唯一の方法でした。これはこれまで素晴らしいことです。今私ができることができるようにしたいのは、1つのインデックスまたは行に異なる色のテキストを付けることです。Javafx Textマルチワードカラー化

例: "こんにちはは" 緑のだろうと、 "世界は" 青いだろう

listView[0] = "Hello " + "world"; 

。これがjavafxのテキストまたは他の方法で私はそれについて行く方法を知りたいと思います使用することができれば。私はJavafx Textを主な犯人として使用しています。

私は誰もが私がここでやろうとしているものを理解し、そうでない場合は、私が知っていると私はそれを少し言い替えるしようとするでしょうことを願って。私は解決策を見つけ出すことができましたjewelseaへ

SOLUTION

感謝。私はセルファクトリーを使用するのではなく、少し違ったアプローチをしました。

のListView

ListView<FlowPane> consoleWindow = new ListView<>(); 
ArrayList<FlowPane> consoleBuffer = FXCollections.observableArrayList(); 

consoleWindow.setItems(consoleBuffer); 

inputBox.setOnKeyPressed(new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent keyEvent) { 
      if (keyEvent.getCode() == KeyCode.ENTER) { 
       consoleBuffer.add(parseInput.parseInputToArray(inputBox.getText())); 
      } 
      consoleWindow.scrollTo(consoleBuffer.size()); 
     } 
}); 

ConsoleInputParse

public class ConsoleInputParse { 

private String[] wordList = {}; 

public ConsoleInputParse() {} 

public FlowPane parseInputToArray(String input) { 
    wordList = input.trim().split("[ ]+"); 

    return colorize(); 
} 

public FlowPane colorize() { 

    ArrayList<Text> textChunks = new ArrayList<>(); 
    FlowPane bundle = new FlowPane(); 

    //Todo: use regex to check for valid words 
    for (String word : wordList) { 
     String spaced = word + " "; 
     switch (word) { 
      case "Hello": case "hello": 
       textChunks.add(customize(spaced, "purple")); 
       break; 
      case "World": case "world": 
       textChunks.add(customize(spaced, "blue")); 
       break; 
      case "Stack Overflow": 
       textChunks.add(customize(spaced, "orange", "Arial Bold", 15)); 
      default: 
       textChunks.add(customize(spaced, "black", "Arial", 13)); 
       break; 
     } 
    } 

    bundle.getChildren().addAll(textChunks); 
    return bundle; 
} 

public Text customize(String word, String color) { 
    return TextBuilder.create().text(word).fill(Paint.valueOf(color)).build(); 
} 

public Text customize(String word, String color, String font) { 
    return TextBuilder.create() 
      .text(word) 
      .fill(Paint.valueOf(color)) 
      .font(Font.font(font, 12)).build(); 
} 

public Text customize(String word, String color, String font, int fontSize) { 
    return TextBuilder.create() 
      .text(word) 
      .fill(Paint.valueOf(color)) 
      .font(Font.font(font, fontSize)).build(); 
} 

} 

1 "実施例"

答えて

8

Cを作成します。あなたのListViewためustom cellfactory、それは異なるTextインスタンスとFlowPane、異なるスタイルを持つ各を含む細胞を生成しています。この方法を示すためにsampleを作成しました。

出力例:あなたはFlowPaneにテキストではなく、異なるTextインスタンスの組み合わせのスタイルをTextFlowを使用することができJava 8

colorized text

+0

はあなたがcellfactoryがうまくいくかについて共有できるすべてのリソースを持っていますか、またはどのように顧客にのようなものを構築します。 javafxのその部分は、常に私を混乱させる。 'ListView'とJavaを使用して – DerekE

+0

トムSchindl [実装何か](http://tomsondev.bestsolution.at/2013/02/20/from-styledtextviewer-to-a-styledtexteditor-with-javafx8/)8'のTextFlow 'しかし、それはおそらくあなたが望むもののために過度の方法です。基本的な例をまとめることができるかどうかがわかります。 – jewelsea

+1

ListView + FlowPane +複数のテキストノードの組み合わせに基づいて、[サンプルソリューション](https://gist.github.com/jewelsea/5036908)へのリンクを追加しました。 – jewelsea

関連する問題