2012-02-03 154 views
7

Estamos utilizando el control TextArea de JavaFX en nuestra aplicación y tratando de integrarlo con Jazzy API de corrección ortográfica - como en, cuando un usuario ingresa una palabra incorrecta que no está en el diccionario, dicha palabra sería resaltado.Resaltar cadenas en JavaFX TextArea

¿Hay alguna forma de resaltar una palabra en dicho control? No he visto opciones para eso en los JavaDocs, entonces, ¿alguien podría sugerir un enfoque?

Podría ser posible, supongo, utilizar el componente HTMLEditor y colorear las palabras de manera diferente con <font face="red=>wrongWord</font>. Esto, sin embargo, trae muchos problemas diferentes con la revisión ortográfica, como las etiquetas html y el recuento de palabras.

Respuesta

8

El control JavaFX TextArea (a partir de 2.0.2) no es compatible con la edición de texto enriquecido donde se mezclan los estilos de texto (fuentes, etc.).

Puede resaltar cadenas contiguas de caracteres en el TextArea mediante la manipulación de SelectRange del TextArea, como en el siguiente ejemplo:

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

Usted puede utilizar el código anterior como base para cambiar el TextArea a sólo lectura modo mientras que la revisión ortográfica está sucediendo. Implemente indicaciones para buscar y corregir cada palabra por turno hasta que se complete la revisión ortográfica. Realice las indicaciones en un cuadro de diálogo o panel por separado. La demostración de Jazzy parece funcionar de esta manera http://jazzy.sourceforge.net/demo.html, por lo que debería ser bastante fácil convertir su UI Swing a JavaFX.


Como alternativa, puede utilizar un control WebView JavaFX para envolver cualquiera de los muchos correctores ortográficos basados ​​JavaScript/HTML (por ejemplo http://www.javascriptspellcheck.com/) utilizando una técnica similar a lo que se ha demostrado aquí: http://jewelsea.wordpress.com/2011/12/11/codemirror-based-code-editor-for-javafx/.

13

RichTextFX le permite agregar estilo a los rangos de texto.

5

Es posible ... más o menos

Sé que esta pregunta se resuelve, pero he encontrado una manera de solucionar el problema y pensé que había puesto que para otras personas que también tropiezan con este post . Esto es un poco hacky, pero funciona en caso de necesidad si necesita resaltar texto en un TextArea y no quiere aceptar la respuesta insatisfactoria "imposible".

  1. Recuperar el color de fondo del TextArea y el color de fondo de la fuente del texto
  2. Calcular la papelera de alto contraste entre el primer plano y color de fondo
  3. Coloque un rectángulo alrededor del texto deseado
  4. Conjunto el color del rectángulo en el color de fondo
  5. Establezca el modo de combinación del rectángulo en el contenedor de mayor contraste
  6. Desactive el rectángulo

El rectángulo ahora se combinará perfectamente con el fondo pero cambiará el color del texto. Desactivar el rectángulo significa que no aparecerá como algo más que ascético para el usuario, por ejemplo, acciones como hacer clic en el rectángulo no tendrán ningún efecto sorpresa.

Puede modificar ligeramente este método si desea una variedad de colores.

Puedo publicar los detalles de implementación si la gente está interesada, es escéptica o si es complicado ponerse a trabajar.

+1

I me gustaría saber más sobre esta solución. Especialmente # 3. ¿Cómo sabes dónde colocar el rectángulo? qué sucede cuando la ventana/TextArea se mueve; ¿cómo lidias con excepciones como texto medio oculto u oculto? ¿Qué sucede cuando TextArea se desplaza? –

+0

Whoa, amigo, eso es hacky! ¡prestigio! ;-) –

+0

¿Cómo decides dónde colocar este rectángulo? Por ejemplo, digamos que quiero resaltar los caracteres 7-13 (¡y no sé si eso incluye un salto de línea!), ¿Cómo puedo decidir dónde va la esquina superior izquierda del rectángulo? –

5

Con JavaFX 8 puede utilizar TextFlow

Se pueden definir ciertas clases de estilo para negrita, de color rojo, verde o cualquier tipo de Texts y organizar en TextFlow, mientras que la asignación de clase de estilo deseada a cada texto