Вопрос

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 вы просто рисуете его как выделено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top