2013-02-26 13 views
5

Ok, mam obiekt ListView. Używam tego jako rodzaj okna konsoli dla mojego serwera. To był naprawdę jedyny sposób, w jaki mogłem wymyślić kolorowany tekst w takim pudełku. Co do tej pory działa cudownie. Teraz to, co chcę zrobić, to kolorować inny tekst na jednym indeksie lub linii.Javafx Tekst wielowymiarowy colorization

Przykład:

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

Gdzie "Witam" będzie zielony i "świat" będzie niebieski. Jeśli można to zrobić u nas javafx Text lub w inny sposób chciałbym wiedzieć, jak to zrobić. Używam Javafx Text jako głównego winowajcy, ponieważ można tak wiele dostosować.

Mam nadzieję, że każdy może zrozumieć, co próbuję tutaj zrobić, jeśli nie, daj mi znać, a ja spróbuję nieco go zmienić.

ROZWIĄZANIE

Dzięki jewelsea udało mi się wymyślić rozwiązanie. Poszedłem z nieco innym podejściem, zamiast używać komórki komórkowej.

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 "Przykład roboczy"

Odpowiedz

8

Tworzenie c ustom cellfactory dla twojego ListView i niech generuje komórki zawierające FlowPane z różnymi instancjami Text, z których każda ma różne style. Stworzyłem sample, aby zademonstrować tę metodę.

Przykładowe wyjście:

colorized text

W Java 8 można można użyć TextFlow projektować swój tekst zamiast kombinacji różnych Text przypadkach w FlowPane.

+0

Czy masz jakieś zasoby, którymi możesz podzielić się na temat działania komórki komórkowej lub jak zbudować coś takiego klientowi. Ta część javafx zawsze mnie myliła. – DerekE

+0

Tom Schindl [zaimplementował coś] (http://tomsondev.bestsolution.at/2013/02/20/from-styledtextviewer-to-a-styledtexteditor-with-javafx8/) za pomocą 'ListView' i Java 8' TextFlow ', ale to pewnie przesada, jeśli chcesz. Zobaczę, czy mogę złożyć podstawowy przykład. – jewelsea

+1

Dodano link do [przykładowego rozwiązania] (https://gist.github.com/jewelsea/5036908) w oparciu o połączenie ListView + FlowPane + wielu węzłów Tekstu. – jewelsea