一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

JTextArea 图片水印实现代码

时间:2011-07-21 编辑:简简单单 来源:一聚教程网

具体操作如下:

  重写JViewport的paintComponent(Graphics g)方法.转Graphics为Graphics2D,使用setPaint(Paint paint)方法和fiilRect( )方法,

  用TexturePaint填充JViewport,平铺水印(背景).


/**
  * @param args
  * 通过JScrollPane和JViewport来使JTextArea拥有背景图片,可以通过TexturePaint的平铺来完成的,
  * 要想实现背景,只需要重写paintComponent(Graphics g) 的部分代码即可.
  * 具体步骤: 1.先设置好texture = new TexturePaint(Image img , Rectangle rect );
  * 2.重写setView(JComponent view)方法,先设视图组件的opaque(false).即设view.setOpaque(false);使视图组件不画自己背景,从而突出JViewport背景
  * 2.在paintComponent(Graphics g)中使用super.paintComponent(g);
  * 3.用Graphics2D来setPaint(texture);然后fillRect背景;
  */

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JViewport;

import mai.util.FileUtil;

public class ScrollPaneWatermark extends JViewport{

 
 BufferedImage fgImg , bgImg;
 TexturePaint texture;
 
 //设置视图背景
 public void setBackgroundTexture(URL url) throws IOException{
  bgImg = ImageIO.read(url);
  Rectangle rect = new Rectangle(0,0,bgImg.getWidth(),bgImg.getHeight());
  texture = new TexturePaint(bgImg,rect);
 }
 
 //设置前置装饰
 public void setForegroundBadge(URL url) throws IOException{
  fgImg = ImageIO.read(url);
 }
 
 //用TexturePaint画组件
 public void paintComponent(Graphics g){
  super.paintComponent(g);
  if(texture != null){
   Graphics2D g2 = (Graphics2D)g;
   g2.setPaint(texture);
   g2.fillRect(0, 0, getWidth(), getHeight());
  }
 }
 
 //先将要放进来的视图组件设置为opaque = false;
 public void setView(JComponent view){
  view.setOpaque(false);
  super.setView(view);
 }
 
 public static void main(String[] args) throws MalformedURLException, Exception {
  // TODO Auto-generated method stub
  JFrame jf = new JFrame("带水印的ScrollPane");
  
  JTextArea jta = new JTextArea();
  jta.setText(FileUtil.fileToString(new File("f:/storm_log.txt").toURI().toURL()));
  jta.setLineWrap(true);
  jta.setWrapStyleWord(true);
  
  ScrollPaneWatermark watermark = new ScrollPaneWatermark();
  watermark.setBackgroundTexture(new File("G:/PHOTO/网页素材/背景素材/bj2.gif").toURI().toURL());
  watermark.setView(jta);
  
  JScrollPane jsp教程 = new JScrollPane();
  jsp.setViewport(watermark);
  
  jf.getContentPane().add(jsp);
  jf.pack();
  jf.setVisible(true);
  
 }

}


刚开始想到直接重写JTextArea的paintComponent(Graphics g)方法,将图片直接drawImage上去.后来发现效果不太好.

2.后来发现,基本上JTextArea都会先放进JScrollPane,之后再呈现出来.而JScrollPane是通过呈现视窗Viewport来展示滚动区的.

  所以这里我们可以通过重写JViewport,以达到视窗部分带背景的效果.

 

热门栏目