2010-01-30 5 views
5

Estoy desarrollando un editor WYSIWYG RTF simple en Java y tengo un pequeño problema. Necesito poder sincronizar los botones de alternancia de selección de estilo (como negrita, cursiva, subrayado) con la selección de texto de los usuarios. Por ejemplo, si la selección de texto actual es simple, los botones de alternancia en negrita, cursiva y subrayado no están seleccionados, pero cuando el usuario selecciona texto en negrita y subrayado, se seleccionan los botones de alternancia negrita y subrayado.JTextPane Sincronizar IU de selección de estilos Problema

Ahora estoy bastante seguro de que JTextPane.getInputAttributes() me da los atributos de selección que quiero, pero hay un problema con la escucha de los eventos de actualización de caret. El problema es que el oyente caret adjunto al JTextPane parece llamarse DESPUÉS de que se produzca el cambio de atributo de entrada. Entonces la selección siempre está un paso atrás. Es decir, ¡debo seleccionar el texto dos veces antes de que se actualicen los botones de alternar!

El código importante aquí es:

textPane.addCaretListener(new CaretListener() { 

     @Override 
     public void caretUpdate(CaretEvent e) { 
      syncAttributesWithUI(textPane.getInputAttributes()); 
     } 
    }); 

Y:

private void syncAttributesWithUI(AttributeSet attributes) { 
    boldButton.setSelected(StyleConstants.isBold(attributes)); 
    italicButton.setSelected(StyleConstants.isItalic(attributes)); 
    underlineButton.setSelected(StyleConstants.isUnderline(attributes)); 
} 

Gracias de antemano!

+0

¿Su pregunta ha sido respondida? Si no, considere publicar un SSCCE –

Respuesta

1

El CaretListener está escuchando su textPane, pero los atributos existentes para la selección se encuentran en su Document. Puede usar los métodos CaretEvent para buscar la parte seleccionada de Document y acondicionar sus botones según los estilos que se encuentran allí. Desafortunadamente, la selección puede ser incoherente, p. parte negrita y parte cursiva. Una práctica común es suponer que el usuario desea aplicar un conjunto de atributos completamente nuevo a toda la selección.

+0

El método que sugiere es, de hecho, lo que estaba haciendo originalmente. Obtendría cada elemento de carácter individual de la selección y encontraría la intersección del conjunto de atributos para determinar qué debería reflejar la IU. Pero luego me di cuenta de que 1) El método getInputAttributes() parece hacer esto, y 2) Mi método no puede determinar qué estilo se aplica si el cursor se mueve a la última posición en el documento hasta que el usuario haya activado una entrada. Por supuesto, probablemente pueda determinar esto mediante el cálculo del estilo del personaje en (posición final - 1), pero esperaba que hubiera una manera más clara :( – S73417H

+0

esperaría que el usuario quisiera los atributos devueltos por 'getInputAttributes() 'para permanecer inalterado cuando el cursor está al final. – trashgod

0

Se podría tratar de posponer la sincronización, por lo que los otros cambios que podría pasar en primer lugar:

@Override 
public void caretUpdate(CaretEvent e) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      syncAttributesWithUI(textPane.getInputAttributes()); 
     } 
    }); 
} 

(Negación: El conjeturar desde la parte superior de mi cabeza - que en realidad no escribir una prueba para confirmar)

Cuestiones relacionadas