Z排序和叠加(JLabel和JEditorPane)

时间:2014-09-25 10:15:44

标签: java image swing jeditorpane swixml

我正在尝试将图像(带有Jlabel)显示在JEditorPane上。我正在使用Swixml和Form Layout,我已将JLabel和JEditorPane放在同一个地方。所以我只需将“setVisible”设置为 true false 即可显示图像。

到目前为止,一切都很好。但是当有人试图选择JEditorPane中的文本时,这里有一个丑陋的东西:Bug illustration

我尝试了一些事情:

  1. 禁用JEditorPane:

    没有效果,即使选项不可见,文字也会显示在JLabel上。

  2. 重绘:

    当我重新绘制JLabel时,它会再次向前推,但我必须重复(例如每50ms一次)以使其不可见;

    我也试图重新选择,但是它不能很好地工作,有些情况只是被忽略,或者说速度慢但仍然很难看

  3. 最后一个想法是当JLabel是显示器时阻止鼠标进入JEditorPane,但是MouseEnter事件不能让我从EditorPane中获取点,所以很难将光标放在一个好位置,出自JEditorPane ...

  4. 我尝试了setComponentZOrder,但是我无法使它运行良好(我当然误用它),但我不认为它可以解决我的问题,因为它只会改变绘画顺序(最后一个是绘画是在顶部有Java),但这显然是一个重新绘制的问题。

    有必要指出我被迫使用Java 1.6(在Java 1.7和1.8中使用的识别类我必须使用的冲突,Sun的更改日志谈论1.9中的修复...)< / p>

    上下文是一个Applet,如果我不可理解(英语不是我的母语),请不要犹豫,纠正我并问我。

    感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

让我们来看看DefaultHighlighter。 JEdi​​torPane用它来渲染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);
                }
            }
        }
    }
}

正如你所看到的,它描绘了所有亮点。

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

答案 1 :(得分:0)

我尝试创建Overlap Layout。我注意到了绘画问题。使用响应鼠标事件的组件。

在最后一段我说:

我注意到在使用JButton时,鼠标输入的事件导致重叠的按钮被绘制在顶部的其他按钮上,导致每个组件的渲染混乱。如果您遇到此问题,则解决方案是覆盖JPanel的isOptimizedDrawingEnabled()方法以返回false。这告诉重绘子系统组件重叠,因此可以正确解决绘制问题。

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