可以使用算法实现镜面等各种效果,但也可以简单的通过使用Swing提供的方法实现一些特殊效果。
Swing自带了12种Composite,合理利用还是挺不错的.
源图像:
镜面效果:
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.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class ReflectedImage extends JPanel {
private BufferedImage img;
public ReflectedImage() {
img = loadImage("apple.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 = new BufferedImage(w, h * 2, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = reflect.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
// 绘制原图像
g2.drawImage(img, 0, 0, null);
// 绘制镜面图像
g2.translate(0, h + 1);
g2.drawImage(img, 0, 0, w, (int) (h / 1.5), 0, h, w, 0, null);
// 绘制透明的渐变
g2.setPaint(new GradientPaint(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.9f), 0, (int) (h / 2),
new Color(1.0f, 1.0f, 1.0f, 0.0f)));
// 关键就在DstIn,只使用源图像的透明度,目标图像不透明的地方继续不透明:
// Ar = Ad * As
// Cr = Cd * As
g2.setComposite(AlphaComposite.DstIn);
g2.fillRect(0, 0, w, h);
g2.dispose();
return reflect;
}
// 读取图片
public static BufferedImage loadImage(String path) {
try {
return ImageIO.read(new File(path));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
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();
}
});
}
}
- 大小: 51.7 KB
- 大小: 73.5 KB
分享到:
相关推荐
swing 鼠标事件 loading效果
java利用swing界面实现数独程序.zip
HoneyViewer图片查看器是一个基于java Swing实现的图片查看器,主要实现了图片展示功能。 本实验手册根据需求完成图片读取、切换等功能,平台的全称为:基于java Swing实现的HoneyViewer图片查看器(后简称为: Keep-...
利用Java Swing 实现游戏开发,介绍java swing开发中最基本的容器、控件、边框等,其中教你实现一个菜单栏的关于对话框挺实用的!
来自 <Filthy Rich Clients> 的代码,实现了 Swing 控件的镜面反射效果,效果很不错。
本项目是一套java Swing mysql实现简单的购物系统,主要针对计算机相关专业需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、运行指导视频。 项目都经过严格调试,确保可以运行! 二、技术实现 后端:...
使用Java Swing界面实现数据库基本操作,使用Java Swing界面实现数据库基本操作
java_swing_api文档,是java swing 开发必不可少的学习指导文档,包含了非常全面的API说明。
swing 应用框架 1.3 英文版 API
Swing版的简单计算器,实现加减乘除,第一次写,希望大家给点建议。
Java通过swing界面实现简易飞机小游戏.zipJava通过swing界面实现简易飞机小游戏.zip Java通过swing界面实现简易飞机小游戏.zipJava通过swing界面实现简易飞机小游戏.zip Java通过swing界面实现简易飞机小游戏.zip...
精通 swing swing 帮助文档 eg: JBuilder启动时有一个启动画面,在Jbuilder所有的初始化工作都完成之后,启动画面消失,继而JBuilder可以开始使用。 解决方案: 该方案基于我所做过的一个项目。 1、新建...
java swing mysql实现的酒店管理系统项目源码.zip java swing mysql实现的酒店管理系统项目源码.zip java swing mysql实现的酒店管理系统项目源码.zip java swing mysql实现的酒店管理系统项目源码.zip java swing ...
Java Swing实现的生命游戏Java Swing实现的生命游戏Java Swing实现的生命游戏 Java Swing实现的生命游戏Java Swing实现的生命游戏Java Swing实现的生命游戏 Java Swing实现的生命游戏Java Swing实现的生命游戏Java ...
Java Swing界面实现数据库基本操作 Java Swing界面实现数据库基本操作 Java Swing界面实现数据库基本操作 Java Swing界面实现数据库基本操作
利用JavaSwing实现简单的计算器,输入计算表达式得出结果,支持左右括号,负数以及小数。简单处理表达式不正确的情况,并且负数需打上括号。
Java+Swing+Mysql实现通讯录管理系统源码 查看运行效果:https://blog.csdn.net/chendongpu/article/details/124964333
java Swing多Jpanel仿安卓苹果桌面动态切换滑动效果
实现了音乐列表、播放、暂停、上下歌曲切换等音乐播放器基本功能。利用到JavaSwing、多线程、音乐控制等多个知识点。且代码注释详细。欢迎下载~有问题可以私信我噢 ^_^