Selezione di elementi incorporati in un JTextPane
Domanda
Un JTextPane
ti consente di incorporare JComponents
e immagini . Quando si seleziona una sezione del documento, il testo viene evidenziato ma gli elementi incorporati no. Puoi avere i componenti incorporati notificati tramite un CaretListener
dopo l'evento, ma mi chiedevo se c'era un modo per evidenziarli durante le selezioni del mouse?
Soluzione 2
Installa un evidenziatore
personalizzato nel JTextPane
, che può informare i componenti incorporati quando devono essere evidenziati o meno:
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 ... */
}
}
Altri suggerimenti
È possibile utilizzare un MouseMotionListener e gestire l'evento mouseDragged. Dovresti quindi utilizzare il metodo viewToModel () per sapere quale parte del modello è stata selezionata.
Beh, ho fatto qualcosa di simile, molto tempo fa. Nel mio caso i componenti incorporati erano emoticon in un editor di chat. Quello che fai è che quando si verifica una selezione, ottieni il segno e il punto (e.getMark, e.getDot). Se lo smiley si trova tra il segno e il punto, allora dovrebbe essere evidenziato, quindi si imposta un campo nel componente smiley che dice di essere evidenziato e si inserisce una richiesta di ridipingere. Infine, nel metodo paint (g) del componente smiley lo dipingi come evidenziato.