想完成这样一个效果:我有一堆信息,这些信息有两种状态,A,已审核;B,未审核。
当显示的信息为A状态时,JPanel在背景中显示浅颜色或是半透明的“XXXX已审核”
当信息为B状态时,则把水印清除。
请高手给支几招,最好有例子,谢谢。我自己试了背景图,但是在paintChildren时,经常会cpu100%不知道为什么
我还试了drawString,但是效果不太好,如果不放在paintComponent中,切换窗口,水印会消息。放在paintComponent中,某些文字会叠加在一起,也不知道为什么。

解决方案 »

  1.   

    没研究过,但感觉应该从paintComponent下手。该方法会被paint调用,而paint会由swing在需要重绘(比如切换窗口)的时候自动调用。如果不放在这里,自然水印会消失。
      

  2.   

    相信你应该看过API说明了,里面有些注意事项。
      

  3.   

    在JPanel的paintComponent方法里绘制就可以了,不会占用什么CPU的,例如下面的代码
    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.Transparency;
    import java.awt.image.BufferedImage;import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;import util.ImageUtil;@SuppressWarnings("serial")
    public class ReflectedImage extends JPanel {
        private BufferedImage img;    public ReflectedImage() {
            img = ImageUtil.loadImage("resources/code.png");
            img = createReflectedImage(img);
            setBackground(Color.BLACK);
        }    @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BICUBIC);        g2d.drawImage(img, 30, 30, null);
        }    // 因为Swing的back-buffer是不透明的,所以要自己创建一个透明图片来处理反射
        public static BufferedImage createReflectedImage(BufferedImage img) {
            int w = img.getWidth();
            int h = img.getHeight();
            BufferedImage reflect = null;
            
            // 使用设备相关的buffered image
            reflect = ImageUtil.createCompatibleImage(w, h * 2, Transparency.TRANSLUCENT);
            // reflect = new BufferedImage(w, h * 2, BufferedImage.TYPE_INT_ARGB); // 平台无关
            
            Graphics2D g2d = reflect.createGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BICUBIC);        // 绘制原图像
            g2d.drawImage(img, 0, 0, null);
            // 绘制反射的图像
            g2d.translate(0, h + 1);
            g2d.drawImage(img, 0, 0, w, (int) (h / 1.5), 0, h, w, 0, null);        // 绘制透明的渐变
            g2d.setPaint(new GradientPaint(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.5f), 0, (int) (h / 2),
                new Color(1.0f, 1.0f, 1.0f, 0.0f)));
            // 关键就在DstIn,只使用源图像的透明度,目标图像不透明的地主继续不透明:
            // Ar = Ad * As
            // Cr = Cd * As
            g2d.setComposite(AlphaComposite.DstIn);
            g2d.fillRect(0, 0, w, h);        g2d.dispose();        return reflect;
        }    private static void createGuiAndShow() {
            JFrame frame = new JFrame("Reflected Image");
            frame.getContentPane().add(new ReflectedImage());        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 520);
            frame.setLocationRelativeTo(null);
            frame.setAlwaysOnTop(true);
            frame.setVisible(true);
        }    public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    createGuiAndShow();
                }
            });
        }
    }
      

  4.   

    JAVA水印,可以给你看下如下代码package com.page;
    import java.io.File;
    import java.io.FileOutputStream;
    import javax.imageio.ImageIO;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    /**
     * 图片水印
     * waterMark.imgMark(原始文件路径, 水印文件路径);
     * 透明水印,将水印图片设置为透明背景就可以了(png格式)
     */
    public class WaterMark {
     public void imgMark(String strOriginalFileName, String strWaterMarkFileName) {
      try {
       // 源文件
       File fileOriginal = new File(strOriginalFileName);
       Image imageOriginal = ImageIO.read(fileOriginal);
       int widthOriginal = imageOriginal.getWidth(null);
       int heightOriginal = imageOriginal.getHeight(null);
       // System.out.println("widthOriginal:" + widthOriginal
       // + "\theightOriginal:" + heightOriginal);
       BufferedImage bufImage = new BufferedImage(widthOriginal,
         heightOriginal, BufferedImage.TYPE_INT_RGB);
       Graphics g = bufImage.createGraphics();
       g.drawImage(imageOriginal, 0, 0, widthOriginal, heightOriginal,
         null);
       // 水印文件
       File fileWaterMark = new File(strWaterMarkFileName);
       Image imageWaterMark = ImageIO.read(fileWaterMark);
       int widthWaterMark = imageWaterMark.getWidth(null);
       int heightWaterMark = imageWaterMark.getHeight(null);
       // System.out.println("widthWaterMark:" + widthWaterMark
       // + "\theightWaterMark:" + heightWaterMark);
       // 水印文件在源文件的右下角
       g.drawImage(imageWaterMark, widthOriginal - widthWaterMark,
         heightOriginal - heightWaterMark, widthWaterMark,
         heightWaterMark, null);
       g.dispose();
       FileOutputStream fos = new FileOutputStream(strOriginalFileName);
       JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
       encoder.encode(bufImage);
       fos.flush();
       fos.close();
       fos = null;
      } catch (Exception e) {
       e.printStackTrace();
       System.out.println("++WaterMark-Build the water fail.");
      }
     }
     // 测试
     public static void main(String[] args) {
      WaterMark waterMark = new WaterMark();
      waterMark.imgMark("d:/t3.jpg", "d:/water.png");
     }
    }希望对你有帮助
      

  5.   

    暂时不用这个效果了。
    分数平分。3楼的,我少个包util.ImageUtil,跑不起来。懒得找了。
    5楼的,倒是水印,不过好像不是jpanel上用的。以后估计用得上。
      

  6.   

    呵呵,忘了,那个主要是读取图片,用的是ImageIO.read,自己写也是几句代码。
    其实主要表现的是怎么在JPanel上画图,*^_^*