Выбор встроенных элементов в JTextPane - PullRequest
2 голосов
/ 23 октября 2009

A JTextPane позволяет вставлять JComponents и изображения . Когда вы выбираете раздел документа, текст выделяется, а встроенные элементы - нет. Вы можете получить уведомление о встроенных компонентах через CaretListener после события, но мне было интересно, есть ли способ выделить их при выборе мыши?

Ответы [ 3 ]

0 голосов
/ 26 октября 2009

Ну, я сделал что-то подобное, давным-давно. В моих случаях встроенные компоненты были смайликами в редакторе чата. Что вы делаете, так это то, что когда происходит выбор, вы получаете метку и точку (e.getMark, e.getDot). Если смайлик находится между отметкой и точкой, то он должен быть подсвечен, поэтому вы устанавливаете поле в компоненте смайлика, которое будет подсвечиваться, и выставляете запрос на перерисовку. Наконец, в методе paint (g) компонента smiley вы просто рисуете его как выделено.

0 голосов
/ 28 октября 2009

Установите пользовательский 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 ... */ 
    }
}
0 голосов
/ 23 октября 2009

Вы можете использовать MouseMotionListener и обрабатывать событие mouseDragged. Затем вам нужно будет использовать метод viewToModel (), чтобы узнать, какая часть модели была выбрана.

...