JTextPane带有背景图像和剪切矩形的问题

| 我对Swing有问题,只是找不到原因。我有一个JTextPane,已扩展为显示背景图像。这可以是栅格图像(通过标准Java API显示)或SVG矢量图像(通过SVG Salamander显示)。 由于我希望文本窗格的顶部具有一个不显示任何文本的边距区域,因此我执行以下操作:我覆盖paintComponent(),绘制背景图像,然后调用super.paintComponent()这样这样将显示文本等,最后我再次绘制了一张背景图像,但带有一个剪切矩形,仅覆盖了顶部边缘区域中的文本。 除了我已经战斗了几天的小故障之外,这一切都很好:对于光栅图像,如果我在文本窗格中选择文本,则文本将被删除而不是突出显示。也就是说,当我选择文本时,背景图像显示在我选择的部分上。我不明白为什么会这样,因为第一次绘制图像的调用是在super.paintComponent()之前调用的,所以第二次调用具有剪切矩形,因此它仅绘制边缘,如果我不这样做,一切都可以正常工作不进行选择。一些额外的线索: 我确实知道这与第二次通话有关,因为如果我发表评论,我就不会遇到这个问题(但是我没有保证金)。 奇怪的是,当背景是矢量图像时,只有光栅图像不会发生。 这是我的paintComponent()方法的代码:
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的原因:我尝试构建一个SSCCE,但是如果我单独使用此类,那么它实际上可以工作。我无法在整个系统之外重现该问题,而且我也不知道是哪个交互产生了该问题。但是我将非常感谢任何提供提示以正确方向指向我的人-也许有人以前见过这种事情,并且可能知道可能是什么原因... 更新:通过停止使用setClip(),我设法解决了这个问题。我找到了这个答案,建议不要在paintComponent()中使用setClip():Java Swing Clipping问题 现在,我没有使用剪切矩形,而是创建了一个子图像,该子图像包含要在边缘上绘制的图像的顶部,然后直接绘制该图像而无需调用setClip()。这可能效率很低,因为当我应该将两个图像存储在内存中时,我会将两个图像存储在内存中,但至少它可以正常工作。如果有人对看到这种黑客感到好奇,就在这里(此刻的代码有点脏):http://code.google.com/p/aetheria/source/browse/trunk/age/src/ eu / irreality / age / swing / FancyJTextPane.java?r = 305 仍然,如果有人能够弄清楚以这种方式使用setClip()会导致这些问题的确切原因,或者知道解决此问题的有效方法,那将很有趣。感谢所有的答案! :)     
已邀请:
        为什么要通过使用paintComponent来烦扰绘画图像(如果存在)JLabel和如何使用图标,其他有价值的信息在“执行自定义绘画”中进行了描述,并在2D图形中进行了扩展,此处提供大量示例和2D-Graphics-GUI     
        除了@mKorbel的有用链接之外,这里还有一些建议: 检查父容器的布局,注意inset和默认值,例如
BorderLayout
表示
JFrame
,ѭ3表示
JPanel
。如您所见,对比色可以提供帮助。 在父级ѭ5上,应至少调用一次called6 once,因为它“使此
Window
的大小适合其子组件的首选大小和布局。” 在一种情况下,而不是另一种情况下,严格检查ѭ8的使用,并指出您可能需要ѭ9以及ѭ10。 查看如何使用编辑器窗格和文本窗格中的示例。 顺便说一句,考虑德摩根定律是否可以简化“ 11”法中的谓词:
setOpaque(!(rasterBackgroundImage == null && vectorBackgroundImage == null));
    

要回复问题请先登录注册