Выбор встроенных элементов в JTextPane
Вопрос
JTextPane
позволяет вам вставлять JComponents
и изображения . Когда вы выбираете раздел документа, текст выделяется, а встроенные элементы - нет. Вы можете уведомить встроенные компоненты с помощью CaretListener
после события, но мне было интересно, есть ли способ выделить их при выборе мыши?
Решение 2
Установите пользовательский Highlighter
в JTextPane
, который может информировать встроенные компоненты, когда они должны быть выделены или нет:
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 ... */
}
}
Другие советы
Вы можете использовать MouseMotionListener и обрабатывать событие mouseDragged. Затем вам нужно будет использовать метод viewToModel (), чтобы узнать, какая часть модели была выбрана.
Ну, я сделал что-то подобное, давным-давно. В моих случаях встроенные компоненты были смайликами в редакторе чата. Что вы делаете, так это то, что когда происходит выбор, вы получаете метку и точку (e.getMark, e.getDot). Если смайлик находится между отметкой и точкой, то он должен быть подсвечен, поэтому вы устанавливаете поле в компоненте смайлика, которое будет подсвечиваться, и выставляете запрос на перерисовку. Наконец, в методе paint (g) компонента smiley вы просто рисуете его как выделено.