2013-02-26 22 views
5

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(); 
} 

} 

1 "Çalışma Örneği"

cevap

8

bir c oluştur ListView için cellfactory kullanın ve her biri farklı stilleri olan farklı Text örnekleriyle FlowPane içeren hücreler oluşturun. Bu yöntemi göstermek için bir sample oluşturdum.

Örnek çıktı:

colorized text

Java 8 içinde sizden metin yerine FlowPane farklı Text durumlarda bir arada stil TextFlow de kullanabilirsiniz.

+0

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

+0

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

+1

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