2012-02-03 18 views
7

używamy TextArea kontrolę JavaFX w naszej aplikacji, a stara się zintegrować go z Jazzy sprawdzanie pisowni API - jak w, gdy użytkownik wchodzi do złego słowa nie ma w słowniku, takie słowo byłoby podświetlony.Podświetlanie Strings w JavaFX TextArea

Czy istnieje sposób podświetlenia słowa we wspomnianej kontrolce? Nie widziałem żadnych opcji w JavaDocs, więc jeśli ktoś mógłby zaproponować podejście?

Może się zdarzyć, że mogę użyć komponentu HTMLEditor i kolorować te słowa dyferencyjnie przy pomocy <font face="red=>wrongWord</font>. Przynosi to jednak wiele różnych problemów z sprawdzaniem pisowni, takich jak znaczniki html i liczba słów.

Odpowiedz

8

Formant JavaFX TextArea (od wersji 2.0.2) nie obsługuje edycji tekstu sformatowanego, w którym style tekstowe (czcionki itp.) Są mieszane.

Można wyróżnić przylegające ciągi znaków w polu tekstowym poprzez manipulowanie selectRange textarea, tak jak w poniższym przykładzie:

public class TextHighlight extends Application { 
    public static void main(String[] args) { Application.launch(args); } 
    @Override public void start(Stage stage) { 
    final TextArea text = new TextArea("Here is some textz to highlight"); 
    text.setStyle("-fx-highlight-fill: lightgray; -fx-highlight-text-fill: firebrick; -fx-font-size: 20px;"); 
    text.setEditable(false); 
    text.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent t) { t.consume(); } 
    }); 

    stage.setScene(new Scene(text)); 
    stage.show(); 

    Platform.runLater(new Runnable() { 
     @Override public void run() { text.selectRange(13, 18); } 
    }); 
    } 
} 

Można użyć powyższy kod jako podstawa do przełączania TextArea tylko do odczytu tryb podczas sprawdzania pisowni. Wprowadź podpowiedź, aby znaleźć i naprawić każde słowo po kolei, aż do sprawdzenia pisowni. Wykonaj monit w oddzielnym oknie dialogowym lub panelu. Wydaje się, że demo Jazzy działa w ten sposób http://jazzy.sourceforge.net/demo.html, więc powinno być dość łatwo przekonwertować jego Swing UI na JavaFX.


Alternatywnie, można użyć kontroli Webview JavaFX zawinąć każdy z wielu javascript/html warcaby opartych czarów (np http://www.javascriptspellcheck.com/) wykorzystujących technikę podobną do tego, co jest wykazane tutaj: http://jewelsea.wordpress.com/2011/12/11/codemirror-based-code-editor-for-javafx/.

5

To jest możliwe ... rodzaj

Wiem, że to pytanie jest rozwiązany, ale znalazłem sposób, aby rozwiązać ten problem i myślałem, że będę pisać do innych ludzi, którzy również natknąć się na tym stanowisku . Jest to trochę hacky, ale działa szczypto, jeśli chcesz podświetlić tekst w TextArea i nie chcesz zaakceptować niezadowalającej "niemożliwej" odpowiedzi.

  1. Odzyskaj kolor tła pola tekstowego i pierwszoplanowy kolor czcionki tekstu
  2. Oblicz bin największym kontraście między pierwszym planem i tłem koloru
  3. umieścić prostokąt wokół żądanego tekstu
  4. Set kolor prostokąta na kolor tła
  5. Ustawienie trybu blendowania prostokąta na pojemnik o największym kontraście
  6. Wyłącz prostokąt

Prostokąt będzie teraz idealnie komponował się z tłem, ale zmieni kolor tekstu. Wyłączenie prostokąta oznacza, że ​​nie pojawi się on jako coś więcej niż ascetyczne dla użytkownika - np. Działania takie jak kliknięcie prostokąta nie będą miały zaskoczenia.

Możesz nieznacznie zmodyfikować tę metodę, jeśli pożądane są różne kolory.

Potrafię opublikować szczegóły realizacji, jeśli ludzie są zainteresowani, sceptycznie nastawieni lub jeśli podjęcie pracy jest trudne.

+1

I chciałbym dowiedzieć się więcej o tym rozwiązaniu. Zwłaszcza # 3. Skąd wiesz, gdzie umieścić prostokąt; co się stanie, gdy okno/TextArea się poruszy; jak radzisz sobie z wyjątkami, takimi jak tekst półprzenikowany lub ukryty; co się dzieje, gdy przewija się TextArea? –

+0

Whoa, koleś, to jest hacky! sława! ;-) –

+0

Jak zdecydujesz, gdzie umieścić ten prostokąt? Na przykład, powiedz, że chcę wyróżnić znaki 7-13 (i nie wiem, czy to zawiera łamanie wierszy !!), jak mogę zdecydować, skąd się bierze lewy górny róg prostokąta? –

5

Dzięki JavaFX 8 można użyć TextFlow

Można zdefiniować pewne klasy stylu odważne, czerwony, zielony lub dowolnego rodzaju Texts i zorganizować je w TextFlow podczas przypisywania żądaną klasę stylu do każdego tekstu