2013-02-26 9 views
5

Ok, ho un oggetto ListView. Sto usando questo come una sorta di finestra della console per il mio server. Era davvero l'unico modo in cui potevo pensare di visualizzare il testo colorato in una scatola del genere. Che funziona così bene finora. Ora quello che voglio essere in grado di fare è colorare un testo diverso su un indice o linea.Colorazione multi-word di testo Javafx

Esempio:

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

Dove "Ciao" sarebbe verde e "mondo" sarebbe blu. Se questo può essere fatto usando javafx Text o in qualsiasi altro modo mi piacerebbe sapere come farlo. Sto usando Javafx Text come il principale colpevole dato che puoi personalizzare così tanto con esso.

Spero che tutti possano capire cosa sto cercando di fare qui, se no, fammelo sapere e proverò a riformularlo un po '.

SOLUZIONE

Grazie a jewelsea sono stato in grado di capire una soluzione. Sono andato con un approccio un po 'diverso con esso invece di usare un cellfactory.

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 "Esempio di lavoro"

risposta

8

Creare un c ustom cellfactory per il ListView e generare celle contenenti uno FlowPane con diverse istanze Text, ognuna con stili diversi. Ho creato un sample per dimostrare questo metodo.

Esempio di output:

colorized text

In Java 8 è possibile è possibile utilizzare la TextFlow per lo stile il testo, piuttosto che una combinazione di diversi Text istanze in un FlowPane.

+0

Avete risorse da condividere su come funzionerebbe la cellfactory, o su come costruire qualcosa del cliente. Quella parte di javafx mi ha sempre confuso. – DerekE

+0

Tom Schindl [implementato qualcosa] (http://tomsondev.bestsolution.at/2013/02/20/from-styledtextviewer-to-a-styledtexteditor-with-javafx8/) utilizzando un 'ListView' e un Java 8' TextFlow ', ma probabilmente è un modo eccessivo per quello che vuoi. Vedrò se riesco a mettere insieme un esempio di base. – jewelsea

+1

Aggiunto collegamento a una [soluzione campione] (https://gist.github.com/jewelsea/5036908) basata su una combinazione di ListView + FlowPane + più nodi di testo. – jewelsea