Java Z排序和叠加(JLabel和JEditorPane)

Java Z排序和叠加(JLabel和JEditorPane),java,image,swing,jeditorpane,swixml,Java,Image,Swing,Jeditorpane,Swixml,我目前正试图在JEditorPane上显示一个图像(带有Jlabel)。我正在使用Swixml和表单布局,我将JLabel和JEditorPane放在了同一个位置。因此,我只需将“setVisible”设置为true或false,即可显示图像 到目前为止,一切都很好。但是,当有人试图在JEditorPane中选择文本时,下面是一件丑陋的事情: 我尝试了一些东西: 禁用该窗格: 没有效果,即使选择不可见,文本也会显示在JLabel上 重新喷漆: 当我重新粉刷JLabel时,它再次被推到前面,但我必

我目前正试图在JEditorPane上显示一个图像(带有Jlabel)。我正在使用Swixml和表单布局,我将JLabel和JEditorPane放在了同一个位置。因此,我只需将“setVisible”设置为true或false,即可显示图像

到目前为止,一切都很好。但是,当有人试图在JEditorPane中选择文本时,下面是一件丑陋的事情:

我尝试了一些东西:

  • 禁用该窗格:

    没有效果,即使选择不可见,文本也会显示在JLabel上

  • 重新喷漆:

    当我重新粉刷JLabel时,它再次被推到前面,但我必须重复(比如每50毫秒一次)以使其不可见

    我还试着在选择上重新上色,但效果不好,有些情况只是被忽略了,或者速度变慢了,但仍然很难看

  • 最后一个想法是,当JLabel是显示器时,防止鼠标进入绝地窗格,但MouseEnter事件不允许我从EditorPane中获取点,因此很难将光标放在好的位置,离开绝地窗格

  • 我尝试了setComponentZOrder,但是我没能让它很好地工作(我肯定误用了它),但是我不认为它能解决我的问题,因为它只改变了绘制顺序(最后一个绘制的是Java),但这显然是一个重绘问题

    需要指出的是,我被迫使用Java 1.6(Java 1.7和1.8中必须使用的同名类之间的冲突,Sun的更改日志谈到1.9中的修复…)

    上下文是一个小程序,如果我不能理解(英语不是我的母语),请不要犹豫,纠正我并问我

    谢谢你的帮助

    我试图创建一个。我确实注意到绘画问题。具有响应鼠标事件的组件

    在最后一段中,我指出:

    我确实注意到,当使用JButtons时,鼠标输入的事件导致重叠的按钮被绘制在其他按钮的顶部,从而导致每个组件的渲染混乱。如果存在此问题,则解决方案是重写JPanel的
    isoOptimizedDrawingEnabled()
    方法以返回
    false
    。这会告诉重新绘制子系统组件重叠,以便正确解决绘制问题


    也许这对您的情况也有帮助。

    让我们看看DefaultHighlighter。JEditorPane使用它渲染selecton(高光) 它有方法

    public void paint(Graphics g) {
        // PENDING(prinz) - should cull ranges not visible
        int len = highlights.size();
        for (int i = 0; i < len; i++) {
            HighlightInfo info = highlights.elementAt(i);
            if (!(info instanceof LayeredHighlightInfo)) {
                // Avoid allocing unless we need it.
                Rectangle a = component.getBounds();
                Insets insets = component.getInsets();
                a.x = insets.left;
                a.y = insets.top;
                a.width -= insets.left + insets.right;
                a.height -= insets.top + insets.bottom;
                for (; i < len; i++) {
                    info = highlights.elementAt(i);
                    if (!(info instanceof LayeredHighlightInfo)) {
                        Highlighter.HighlightPainter p = info.getPainter();
                        p.paint(g, info.getStartOffset(), info.getEndOffset(),
                                a, component);
                    }
                }
            }
        }
    }
    
    public void绘制(图形g){
    //待定(prinz)-应不可见剔除范围吗
    int len=highlights.size();
    对于(int i=0;i
    正如您所见,它绘制所有高光

    您可以用扩展名替换JEditorPane的高光画师(DefaultHighlighter实例)。
    重写paint()方法并将自定义剪辑添加到图形实例。剪辑应具有基于当前剪辑的自定义形状,其中JLabel矩形被减去。

    NB:我讨厌Java-通常我也是,威士忌太好了。这是一个非常好的主意,我扩展了DefaultHightlighter,并在必须显示图像时剪辑图形。它几乎可以工作,文本和选择不再可见。但我仍然有白色的背景,我当然错过了一些东西,在图像上重新油漆的作品,但它仍然丑陋(闪光)。无论如何,非常感谢!尝试将相同的剪辑逻辑添加到JEditorPane的paintComponent()剪辑paintComponent似乎会使整个事情出错^^^当图像出现时,它会工作,但当我突出显示一些文本时,它会完全混乱^^^重新绘制应该足够了:)谢谢