我对挥杆有个问题,我就是找不到原因。我有一个JTextPane,它已经被扩展到显示背景图像。这可以是光栅图像(通过标准Java显示),也可以是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:我试图构建一个,但是如果我孤立地使用这个类.实际上很管用。我无法在整个系统之外重现这个问题,我也不知道是哪种交互产生了问题。但是我会非常感激任何人给我指点正确的方向--也许有人以前见过这种事情,并且可能知道原因是什么……
更新:通过停止使用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()引起这些问题的确切原因,或者知道解决这些问题的有效方法,那将是很有趣的。谢谢你的回答!:)
发布于 2011-06-18 11:42:53
如果有JLabel和如何使用图标,其他有价值的信息用表演定制绘画描述,用二维图形学、tons示例这里和2D-图形学-GUI进行扩展。
发布于 2011-06-18 19:33:51
除了@mKorbel的有用链接之外,下面还有一些建议:
BorderLayout表示JFrame,FlowLayout表示JPanel。正如你所观察到的,对比颜色会有帮助。Window上,应该至少调用一次pack(),因为它“使该Window的大小符合其子组件的首选大小和布局”。setPreferredSize()在一种情况下的使用情况,而不是另一种情况,注意您可能需要revalidate()和repaint()。set*BackgroundImage()方法中的谓词:
setOpaque(!(rasterBackgroundImage == null && vectorBackgroundImage == null));https://stackoverflow.com/questions/6395667
复制相似问题