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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top