0

我目前正在尝试将图像(带有 Jlabel)显示到 JEditorPane 上。我正在使用 Swixml 和表单布局,我将 JLabel 和 JEditorPane 放在同一个地方。所以我简单地将“setVisible”设置为truefalse以使图像出现。

到目前为止,一切都很好。但是当有人试图在 JEditorPane 中选择文本时,这很丑:错误说明

我尝试了一些事情:

  1. 禁用 JEditorPane :

    没有效果,即使选择不可见,文本也会出现在 JLabel 上。

  2. 重绘:

    当我重新绘制 JLabel 时,它会再次被推到前面,但我必须重复执行(例如每 50 毫秒一次)以使其不可见;

    我也尝试在选择时重新绘制,但效果不佳,某些情况只是被忽略了,或者变慢了仍然很难看

  3. 最后一个想法是在 JLabel 显示时阻止鼠标进入 JEditorPane,但是 MouseEnter 事件不允许我从 EditorPane 中获取点,因此很难将光标放在 JEditorPane 之外的好位置...

我尝试了 setComponentZOrder,但我无法让它正常工作(我当然滥用了它),但我认为它不能解决我的问题,因为它只会改变绘画顺序(最后一个要绘画的东西在 Java 的顶部) ),但这显然是一个重绘问题。

指出我被迫使用 Java 1.6 应该很有用(我必须在 Java 1.7 和 1.8 中使用的相同命名类之间的冲突,Sun 的更改日志谈到了 1.9 中的修复......)

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

感谢您的帮助!

4

2 回答 2

2

让我们看一下 DefaultHighlighter。JEdi​​torPane 用它来渲染选择(亮点) 它有方法

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 矩形的当前剪辑的自定义形状。

于 2014-09-26T08:54:41.697 回答
0

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

在最后一段中,我说:

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

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

于 2014-09-25T14:10:14.703 回答