在JTextPane中选择嵌入的项目

时间:2009-10-23 15:35:13

标签: java swing jtextpane

JTextPane可以embed JComponents and images。选择文档的某个部分时,文本会突出显示,但嵌入的项目不会突出显示。您可以在事件发生后通过CaretListener通知嵌入式组件,但我想知道是否有办法在鼠标选择期间突出显示它们?

3 个答案:

答案 0 :(得分:0)

你可以使用MouseMotionListener并处理mouseDragged事件。然后,您需要使用viewToModel()方法来了解正在选择模型的哪个部分。

答案 1 :(得分:0)

将自定义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 ... */ 
    }
}

答案 2 :(得分:-1)

我做了类似的事情,很久很久以前。在我的例子中,嵌入式组件是聊天编辑器中的表情符号。你做的是当选择发生时,你得到标记和点(e.getMark,e.getDot)。如果笑脸位于标记和点之间,那么它应该被突出显示,因此您在笑脸组件中设置一个字段,告诉要突出显示,并放置一个重绘请求。最后,在笑脸组件的paint(g)方法中,您只需将其绘制为高亮显示。