想完成这样一个效果:我有一堆信息,这些信息有两种状态,A,已审核;B,未审核。
当显示的信息为A状态时,JPanel在背景中显示浅颜色或是半透明的“XXXX已审核”
当信息为B状态时,则把水印清除。
请高手给支几招,最好有例子,谢谢。我自己试了背景图,但是在paintChildren时,经常会cpu100%不知道为什么
我还试了drawString,但是效果不太好,如果不放在paintComponent中,切换窗口,水印会消息。放在paintComponent中,某些文字会叠加在一起,也不知道为什么。
当显示的信息为A状态时,JPanel在背景中显示浅颜色或是半透明的“XXXX已审核”
当信息为B状态时,则把水印清除。
请高手给支几招,最好有例子,谢谢。我自己试了背景图,但是在paintChildren时,经常会cpu100%不知道为什么
我还试了drawString,但是效果不太好,如果不放在paintComponent中,切换窗口,水印会消息。放在paintComponent中,某些文字会叠加在一起,也不知道为什么。
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();
}
});
}
}
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");
}
}希望对你有帮助
分数平分。3楼的,我少个包util.ImageUtil,跑不起来。懒得找了。
5楼的,倒是水印,不过好像不是jpanel上用的。以后估计用得上。
其实主要表现的是怎么在JPanel上画图,*^_^*