2013-02-26 4 views
5

Хорошо, у меня есть объект ListView. Я использую это как консольное окно для своего сервера. Это был единственный способ, с помощью которого можно было отображать раскрашенный текст в коробке. Что до сих пор замечательно. Теперь то, что я хочу сделать, это цветный текст по одному индексу или строке.Javafx Text многословная раскраска

Пример:

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

Где "Привет" будет зеленым и "мир" будет синим. Если это может быть сделано usin javafx Text или любым другим способом, я хотел бы знать, как это сделать. Я использую Javafx Text в качестве основного виновника, так как вы можете так много настроить с ним.

Я надеюсь, что каждый может понять, что я пытаюсь сделать здесь, если нет, сообщите мне, и я попытаюсь немного изменить его.

РЕШЕНИЕ

Благодаря jewelsea мне удалось выяснить решение. Я пошел с ним немного иначе, вместо использования 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 "Рабочий пример"

ответ

8

Создать гр ustom cellfactory для вашего ListView и сгенерировать ячейки, содержащие FlowPane с различными Text экземплярами, каждый с разными стилями. Я продемонстрировал этот метод sample.

Пример вывода:

colorized text

В Java 8 вы можете вы можете использовать TextFlow стилизовать текст, а не сочетание различных Text экземпляров в FlowPane.

+0

Есть ли у вас какие-либо ресурсы, которыми вы могли бы поделиться, о том, как работает cellfactory, или о том, как клиент создает нечто подобное. Эта часть джаваффа меня всегда путала. – DerekE

+0

Том Шиндл [реализовал что-то] (http://tomsondev.bestsolution.at/2013/02/20/from-styledtextviewer-to-a-styledtexteditor-with-javafx8/), используя 'ListView' и Java 8' TextFlow ', но это, вероятно, может быть излишним для того, что вы хотите. Я посмотрю, смогу ли я собрать базовый пример. – jewelsea

+1

Добавлена ​​ссылка на [образец решения] (https://gist.github.com/jewelsea/5036908) на основе комбинации ListView + FlowPane + нескольких текстовых узлов. – jewelsea

Смежные вопросы