Selección de elementos incrustados en un JTextPane
Pregunta
Un JTextPane
le permite incrusta JComponents
e imágenes . Cuando selecciona una sección del documento, el texto se resalta pero los elementos incrustados no. Puede hacer que se notifiquen los componentes incorporados mediante un CaretListener
después del evento, pero me preguntaba si habría alguna forma de resaltarlos durante las selecciones del mouse.
Solución 2
Instale un Highlighter
personalizado en el JTextPane
, que puede informar a los componentes incrustados cuando es necesario resaltarlos o no:
textPane.setHighlighter( new CustomHighlighter() );
// ...
private final class CustomHighlighter extends DefaultHighlighter {
@Override
public Object addHighlight( int p0, int p1, HighlightPainter p ) throws BadLocationException {
Object tag = super.addHighlight(p0, p1, p);
/* notify embedded components ... */
return tag;
}
@Override
public void removeHighlight( Object tag ) {
super.removeHighlight(tag);
/* notify embedded components ... */
}
@Override
public void removeAllHighlights() {
super.removeAllHighlights();
/* notify embedded components ... */
}
@Override
public void changeHighlight( Object tag, int p0, int p1 ) throws BadLocationException {
super.changeHighlight(tag, p0, p1);
/* notify embedded components ... */
}
}
Otros consejos
PUEDES usar un MouseMotionListener y manejar el evento mouseDragged. Entonces necesitarías usar el método viewToModel () para saber qué parte del modelo se estaba seleccionando.
Bueno, hice algo similar, hace mucho tiempo atrás. En mis casos, los componentes incrustados eran emoticonos en un editor de chat. Lo que hace es que cuando ocurre una selección, obtiene la marca y el punto (e.getMark, e.getDot). Si el emoticono se encuentra entre la marca y el punto, entonces se supone que debe estar resaltado, por lo que debe establecer un campo en el componente del emoticono que se resalte y colocar una solicitud de repintado. Finalmente, en el método paint (g) del componente de smiley, solo pinta como está resaltado.