Java Z排序和叠加(JLabel和JEditorPane)
我目前正试图在JEditorPane上显示一个图像(带有Jlabel)。我正在使用Swixml和表单布局,我将JLabel和JEditorPane放在了同一个位置。因此,我只需将“setVisible”设置为true或false,即可显示图像 到目前为止,一切都很好。但是,当有人试图在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时,它再次被推到前面,但我必
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似乎会使整个事情出错^^^当图像出现时,它会工作,但当我突出显示一些文本时,它会完全混乱^^^重新绘制应该足够了:)谢谢