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();
}
}
"Esempio di lavoro"
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
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
Aggiunto collegamento a una [soluzione campione] (https://gist.github.com/jewelsea/5036908) basata su una combinazione di ListView + FlowPane + più nodi di testo. – jewelsea