首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用背景图像和裁剪矩形的JTextPane问题

使用背景图像和裁剪矩形的JTextPane问题
EN

Stack Overflow用户
提问于 2011-06-18 11:30:48
回答 2查看 637关注 0票数 2

我对挥杆有个问题,我就是找不到原因。我有一个JTextPane,它已经被扩展到显示背景图像。这可以是光栅图像(通过标准Java显示),也可以是SVG矢量映像(通过Salamander显示)。

由于我希望文本窗格顶部有一个区域用作不显示任何文本的边距,所以我执行以下操作:重写paintComponent(),绘制背景图像,然后调用super.paintComponent(),以便文本等将被显示,最后我再次绘制背景图像的一部分,但使用一个剪裁矩形只覆盖顶部边缘区域中的文本。

除了我几天来一直在努力解决的一个小问题之外,这个功能非常好:使用光栅图像,如果我在文本窗格中选择文本,文本就会被移除而不是突出显示。也就是说,当我选择文本时,背景图像会显示在我选择的部分上。我不明白为什么会这样,因为绘制图像的第一个调用是在super.paintComponent()之前调用的,所以第二个调用有一个裁剪矩形,所以它只在边距上绘制,如果我不选择,一切都可以正常工作。一些额外的线索:

  • 我知道这与第二个电话有关,因为如果我评论它,我就没有这个问题了(不过,我没有保证金)。
  • 奇怪的是,当背景是矢量图像时,这种情况不会发生,只有光栅图像。

下面是我的paintComponent()方法的代码:

代码语言:javascript
复制
public void paintComponent(Graphics g)
{
    Rectangle rect = null;
    if ( rasterBackgroundImage != null )
    {
        rect = getVisibleRect();
        g.drawImage(rasterBackgroundImage.getImage(),rect.x,rect.y,rect.width,rect.height,this);
    }
    if ( vectorBackgroundImage != null )
    {
        rect = getVisibleRect();
        vectorBackgroundImage.setPreferredSize(new Dimension(rect.width,rect.height));
        vectorBackgroundImage.setScaleToFit(true);
        vectorBackgroundImage.paintIcon(this, g, rect.x, rect.y);
    }

    super.paintComponent(g);

    //if we want a non-scrolling top margin
    if ( rasterBackgroundImage != null )
    {
        g.setClip(rect.x,rect.y,rect.width,getMargin().top);
        g.drawImage(rasterBackgroundImage.getImage(),rect.x,rect.y,rect.width,rect.height,this);
    }
    if ( vectorBackgroundImage != null )
    {
        g.setClip(rect.x,rect.y,rect.width,getMargin().top);
        vectorBackgroundImage.setPreferredSize(new Dimension(rect.width,rect.height));
        vectorBackgroundImage.paintIcon(this, g, rect.x, rect.y);
    }

}

如果有人想看看全班,它就在这里:http://code.google.com/p/aetheria/source/browse/trunk/age/src/eu/irreality/age/swing/FancyJTextPane.java?r=301

请注意,我没有要求修复,因为问题似乎是在与其他类交互。这就是为什么我没有提供一个SSCCE:我试图构建一个,但是如果我孤立地使用这个类.实际上很管用。我无法在整个系统之外重现这个问题,我也不知道是哪种交互产生了问题。但是我会非常感激任何人给我指点正确的方向--也许有人以前见过这种事情,并且可能知道原因是什么……

更新:通过停止使用setClip(),我已经设法解决了这个问题。我找到了一个建议不要在paintComponent():java摆动裁剪问题中使用paintComponent()的答案

现在,我不再使用剪裁矩形,而是创建一个包含图像顶部部分的子图像,我希望在边距上绘制,然后直接绘制,而不调用setClip()。这可能是相当低效的,因为我在内存中存储两个图像,而其中一个应该足够了,但至少它是有效的(Tm)。如果有人对此感到好奇,它就在这里(目前代码有点脏):http://code.google.com/p/aetheria/source/browse/trunk/age/src/eu/irreality/age/swing/FancyJTextPane.java?r=305

但是,如果有人能够找出以这种方式使用setClip()引起这些问题的确切原因,或者知道解决这些问题的有效方法,那将是很有趣的。谢谢你的回答!:)

EN

回答 2

Stack Overflow用户

发布于 2011-06-18 11:42:53

如果有JLabel如何使用图标,其他有价值的信息用表演定制绘画描述,用二维图形学、tons示例这里2D-图形学-GUI进行扩展。

票数 3
EN

Stack Overflow用户

发布于 2011-06-18 19:33:51

除了@mKorbel的有用链接之外,下面还有一些建议:

  • 检查父容器的布局,注意insets和缺省值,例如BorderLayout表示JFrameFlowLayout表示JPanel。正如你所观察到的,对比颜色会有帮助。
  • 在父Window上,应该至少调用一次pack(),因为它“使该Window的大小符合其子组件的首选大小和布局”。
  • 批判性地检查setPreferredSize()在一种情况下的使用情况,而不是另一种情况,注意您可能需要revalidate()repaint()
  • 查看http://download.oracle.com/javase/tutorial/uiswing/components/editorpane.html中的示例。
  • 另外,考虑一下德摩根定律是否可以简化set*BackgroundImage()方法中的谓词: setOpaque(!(rasterBackgroundImage == null && vectorBackgroundImage == null));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6395667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档