2009-11-12 68 views

回答

7

我怀疑你需要继承JTextArea和覆盖paintComponent()方法,先绘制背景图片,并呼吁super.paintComponent()呈现文本:

public void paintComponent (Graphics g) { 
    g.drawImage(watermark, 0, 0, this); 
    super.paintComponent(g); 
} 

编辑:camickr指出,JTextArea是不透明的,所以你的子类将需要通过调用setOpaque(false)来改变它。

+3

您可能还需要使用alpha通道与什么将由超级涂谱写自己的形象() – Dmitry 2009-11-12 14:01:30

+0

大多数水印牵拉到的内容。如果你想这样做,首先调用super.paintComponent(g),然后在其上绘制你的半透明水印图像(或文本)。 您可以选择使用透明图像,也可以使用alpha组合来获得透明度效果。 此外,您可能想要平铺水印,而不是将其绘制在左上角。 我建议你制作一个可重用的Watermark容器,在其内容上绘制水印,所以你可以自由嵌入JTextArea(水印滚动文本)或JScrolledPane(水印保留,文本滚动) – 2009-11-13 09:02:14

1

我怀疑上面给出的建议是可行的。 JTextArea是不透明的,所以文本将在图像顶部绘制。因此,至少您需要使文本区域不相互混淆,然后您需要使用视口和/或滚动窗格的背景颜色。

如果您想要可重复使用的解决方案,请尝试创建ImageBorder。绘画的顺序是:

一)的paintComponent

B)的paintBorder

C)paintChildren

所以,如果你的边框添加到文本区域,将在对文本的面漆一个固定的位置。

或者,如果您将边框添加到视口,它将在文本下方绘制一个浮动位置。

+0

你可以setOpaque(false )并解决了这个小问题。 – ninesided 2009-11-13 08:04:47

1

您也可以考虑使用JXLayer它可以创造相当复杂的视觉效果

+0

使用Java7,您可以访问基于Dmitry提及的项目的[JLayer](http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html)。上面的[link](https://java.net/projects/jxlayer/)也被破坏了。 – predi 2013-10-18 06:56:44