Tamam, bir ListView nesnesine sahibim. Bunu sunucum için bir çeşit konsol penceresi olarak kullanıyorum. Böyle bir kutuda renklendirilmiş metni göstermeyi düşünebilmemin tek yolu buydu. Şimdiye kadar bu harika çalışıyor. Şimdi yapmak istediğim şey, bir dizinde veya satırda renk farklı metin.Javafx Metin çok sözcüklü renklendirme
Örnek:
listView[0] = "Hello " + "world";
"Merhaba" yeşil olacağını ve "Dünya" mavi olurdu nerede. Bu kullanılabilir javafx Metin veya başka bir şekilde yapılabilirse, bunun nasıl yapılacağını bilmek istiyorum. Javafx Text'i birincil suçlu olarak kullanıyorum çünkü bu kadar çok kişiselleştirebiliyorsunuz.
Umarım herkes burada ne yapmaya çalıştığımı anlayabilir, eğer olmasaydı, bana haber ver ve birazcık yeniden yazmayı deneyeceğim.
ÇÖZÜM Bir çözüm anlamaya başardı jewelsea için
teşekkür ederiz. Bir cellfactory kullanmak yerine biraz farklı bir yaklaşımla gittim.
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();
}
}
"Çalışma Örneği"
Cephe sisteminin nasıl çalışacağı veya müşterinin nasıl bir şey inşa edeceği hakkında paylaşabileceğiniz herhangi bir kaynağınız var mı? Javafx'in o kısmı beni her zaman karıştırdı. – DerekE
Tom Schindl [bir şey uyguladı] (http://tomsondev.bestsolution.at/2013/02/20/from-styledtextviewer-to-a-styledtexteditor-with-javafx8/) 'ListView' ve Java 8 'TextFlow kullanarak ', ama bu muhtemelen istediğiniz şey için aşırı fazla. Temel bir örnek oluşturabilir miyim göreceğim. – jewelsea
ListView + FlowPane + çoklu Metin düğümlerinin bir birleşimini temel alan bir [örnek çözüm] (https://gist.github.com/jewelsea/5036908) bağlantısı eklendi. – jewelsea