Хорошо, у меня есть объект 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();
}
}
"Рабочий пример"
Есть ли у вас какие-либо ресурсы, которыми вы могли бы поделиться, о том, как работает cellfactory, или о том, как клиент создает нечто подобное. Эта часть джаваффа меня всегда путала. – DerekE
Том Шиндл [реализовал что-то] (http://tomsondev.bestsolution.at/2013/02/20/from-styledtextviewer-to-a-styledtexteditor-with-javafx8/), используя 'ListView' и Java 8' TextFlow ', но это, вероятно, может быть излишним для того, что вы хотите. Я посмотрю, смогу ли я собрать базовый пример. – jewelsea
Добавлена ссылка на [образец решения] (https://gist.github.com/jewelsea/5036908) на основе комбинации ListView + FlowPane + нескольких текстовых узлов. – jewelsea