Java 在JTextPane中选择嵌入项

Java 在JTextPane中选择嵌入项,java,swing,jtextpane,Java,Swing,Jtextpane,一个JTextPane让您可以。当您选择文档的某个部分时,文本将高亮显示,但嵌入的项目不会高亮显示。事件发生后,您可以通过CaretListener通知嵌入式组件,但我想知道是否有办法在选择鼠标时突出显示它们?您可以使用MouseMotionListener并处理mouseDragged事件。然后,您需要使用viewToModel()方法来知道选择了模型的哪个部分。您可以使用MouseMotionListener并处理mouseDragged事件。然后,您需要使用viewToModel()方法来

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

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

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

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

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

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 ... */ 
    }
}

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 ... */ 
    }
}

“事件发生后,您可以通过CaretListener通知嵌入式组件,但我想知道是否有办法在选择鼠标时突出显示它们”“事件发生后,您可以通过CaretListener通知嵌入式组件,但我想知道是否有办法在选择鼠标时突出显示它们“我已经做了更多的挖掘工作,我强烈怀疑应该在JTextPane上安装一个定制的荧光灯。我明天会试试这个,如果我能让它工作的话,我会添加一个答案。我已经做了更多的挖掘,我强烈怀疑接下来的方法是在JTextPane上安装一个定制的荧光灯。我明天会试试这个,如果我能让它工作的话,我会添加一个答案。