我正在尝试将图像(带有Jlabel)显示在JEditorPane上。我正在使用Swixml和Form Layout,我已将JLabel和JEditorPane放在同一个地方。所以我只需将“setVisible”设置为 true 或 false 即可显示图像。
到目前为止,一切都很好。但是当有人试图选择JEditorPane中的文本时,这里有一个丑陋的东西:
我尝试了一些事情:
禁用JEditorPane:
没有效果,即使选项不可见,文字也会显示在JLabel上。
重绘:
当我重新绘制JLabel时,它会再次向前推,但我必须重复(例如每50ms一次)以使其不可见;
我也试图重新选择,但是它不能很好地工作,有些情况只是被忽略,或者说速度慢但仍然很难看
最后一个想法是当JLabel是显示器时阻止鼠标进入JEditorPane,但是MouseEnter事件不能让我从EditorPane中获取点,所以很难将光标放在一个好位置,出自JEditorPane ...
我尝试了setComponentZOrder,但是我无法使它运行良好(我当然误用它),但我不认为它可以解决我的问题,因为它只会改变绘画顺序(最后一个是绘画是在顶部有Java),但这显然是一个重新绘制的问题。
有必要指出我被迫使用Java 1.6(在Java 1.7和1.8中使用的识别类我必须使用的冲突,Sun的更改日志谈论1.9中的修复...)< / p>
上下文是一个Applet,如果我不可理解(英语不是我的母语),请不要犹豫,纠正我并问我。
感谢您的帮助!
答案 0 :(得分:2)
让我们来看看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);
}
}
}
}
}
正如你所看到的,它描绘了所有亮点。
您可以使用扩展名替换JEditorPane的高亮画家(DefaultHighlighter的实例)。 重写paint()方法并将自定义剪辑添加到Graphics实例。剪辑应该具有基于当前剪辑的自定义形状,其中减去了JLabel矩形。
答案 1 :(得分:0)
我尝试创建Overlap Layout。我注意到了绘画问题。使用响应鼠标事件的组件。
在最后一段我说:
我注意到在使用JButton时,鼠标输入的事件导致重叠的按钮被绘制在顶部的其他按钮上,导致每个组件的渲染混乱。如果您遇到此问题,则解决方案是覆盖JPanel的isOptimizedDrawingEnabled()
方法以返回false
。这告诉重绘子系统组件重叠,因此可以正确解决绘制问题。
也许这对你的情况也有帮助。