Die Auswahl der eingebetteten Elemente in einem JTextPane
Frage
A JTextPane
können Sie einbetten JComponents
und Bilder . Wenn Sie einen Abschnitt des Dokuments auszuwählen, ist der gewünschte Text markiert, aber die eingebetteten Elemente sind nicht. Sie können die eingebetteten Komponenten mittels eines CaretListener
nach der Veranstaltung mitgeteilt haben, aber ich habe mich gefragt, ob es einen Weg, um sie während der Maus Auswahl hervorgehoben zu haben war?
Lösung 2
Installieren Sie eine benutzerdefinierte Highlighter
in die JTextPane
, die die eingebetteten Komponenten informieren können, wenn sie hervorgehoben werden müssen oder nicht:
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 ... */
}
}
Andere Tipps
könnten Sie ein Mouse verwenden und das mouseDragged Ereignis behandeln. Sie würden dann die viewToModel () Methode verwendet werden müssen, um zu wissen, welcher Teil des Modells ausgewählt wurde.
Nun habe ich etwas Ähnliches, lange, lange zurück. In meinen Fällen waren die eingebetteten Komponenten Smileys in einem Chat-Editor. Was Sie tun, ist, dass, wenn eine Auswahl geschieht, können Sie die Markierung erhalten und den Punkt (e.getMark, e.getDot). Wenn der Smiley zwischen der Marke und dem Punkt liegt, dann wird angenommen, hervorgehoben werden, so setzen Sie ein Feld in der Smiley-Komponente zu sagen hervorgehoben werden, und legte ein Repaint Anfrage. Schließlich wird in der Farbe (g) -Methode des Smiley Komponente, die Sie gerade malen wie hervorgehoben.