`
jorneyR
  • 浏览: 16235 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

利用Swing的Api实现镜面效果

阅读更多
可以使用算法实现镜面等各种效果,但也可以简单的通过使用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
分享到:
评论
11 楼 jorneyR 2011-01-14  
juda 写道
楼主能不能把你做的那个边框的代码发上来,很谢谢

这个边框是系统自带的,我使用的是Mac,所以显示为这个样子。
不过相似的样子可以参考MacWidgets的实现,以后我也会考虑做个这方面的边框,毕竟会好看些:http://code.google.com/p/macwidgets/
10 楼 juda 2011-01-14  
楼主能不能把你做的那个边框的代码发上来,很谢谢
9 楼 jorneyR 2011-01-11  
onlylau 写道
jorneyR 写道
kxys422834 写道

我报了这个错误时怎么回事啊

首先要把源图像下载下来保存为apple.png和这个Java的类放在同一个文件夹下,然后才能运行。


如果是用MyEclipse运行的话,那这个apple.png就得放到工程目录下才行

嘿嘿,Eclipse,MyEclipse的工作目录和类加载目录,很让人迷惑。
8 楼 onlylau 2011-01-11  
jorneyR 写道
kxys422834 写道
javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1275)
at com.test.ReflectedImage.loadImage(ReflectedImage.java:70)
at com.test.ReflectedImage.<init>(ReflectedImage.java:22)
at com.test.ReflectedImage.createGuiAndShow(ReflectedImage.java:80)
at com.test.ReflectedImage.access$0(ReflectedImage.java:78)
at com.test.ReflectedImage$1.run(ReflectedImage.java:93)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.test.ReflectedImage.createReflectedImage(ReflectedImage.java:39)
at com.test.ReflectedImage.<init>(ReflectedImage.java:23)
at com.test.ReflectedImage.createGuiAndShow(ReflectedImage.java:80)
at com.test.ReflectedImage.access$0(ReflectedImage.java:78)
at com.test.ReflectedImage$1.run(ReflectedImage.java:93)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
我报了这个错误时怎么回事啊

首先要把源图像下载下来保存为apple.png和这个Java的类放在同一个文件夹下,然后才能运行。


如果是用MyEclipse运行的话,那这个apple.png就得放到工程目录下才行
7 楼 jorneyR 2011-01-11  
kxys422834 写道
javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1275)
at com.test.ReflectedImage.loadImage(ReflectedImage.java:70)
at com.test.ReflectedImage.<init>(ReflectedImage.java:22)
at com.test.ReflectedImage.createGuiAndShow(ReflectedImage.java:80)
at com.test.ReflectedImage.access$0(ReflectedImage.java:78)
at com.test.ReflectedImage$1.run(ReflectedImage.java:93)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.test.ReflectedImage.createReflectedImage(ReflectedImage.java:39)
at com.test.ReflectedImage.<init>(ReflectedImage.java:23)
at com.test.ReflectedImage.createGuiAndShow(ReflectedImage.java:80)
at com.test.ReflectedImage.access$0(ReflectedImage.java:78)
at com.test.ReflectedImage$1.run(ReflectedImage.java:93)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
我报了这个错误时怎么回事啊

首先要把源图像下载下来保存为apple.png和这个Java的类放在同一个文件夹下,然后才能运行。
6 楼 kxys422834 2011-01-11  
javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1275)
at com.test.ReflectedImage.loadImage(ReflectedImage.java:70)
at com.test.ReflectedImage.<init>(ReflectedImage.java:22)
at com.test.ReflectedImage.createGuiAndShow(ReflectedImage.java:80)
at com.test.ReflectedImage.access$0(ReflectedImage.java:78)
at com.test.ReflectedImage$1.run(ReflectedImage.java:93)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.test.ReflectedImage.createReflectedImage(ReflectedImage.java:39)
at com.test.ReflectedImage.<init>(ReflectedImage.java:23)
at com.test.ReflectedImage.createGuiAndShow(ReflectedImage.java:80)
at com.test.ReflectedImage.access$0(ReflectedImage.java:78)
at com.test.ReflectedImage$1.run(ReflectedImage.java:93)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
我报了这个错误时怎么回事啊
5 楼 bitray 2011-01-11  
jorneyR 写道
bitray 写道
jorneyR 写道
003 写道
呵呵,不错
有个建议,创建BufferedImage的时候最好不要直接new,这样效率会相当的差,我在做三号管家的时候,开始也是全部用的new BufferedImage,后来发现皮肤图片比较大的时候卡的一塌糊涂。
最后改用GraphicsConfiguration.createCompatibleImage来获取BufferedImage,瞬间流畅。

是的,compatible image是与硬件相关的,能够显示得更快,缺点是在不同的环境下表现得不一样。如果只是显示则用compatible image,如果是做效果处理最好是使用buffered image,因为buffered image是平台无关的。


呃,那如果仅仅是为了显示效果变好,不涉及移植什么的,是不是还是compatible image好些呢?

compatible image是根据硬件环境加快显示速度,而不是显示效果最好。
需要效果好的,使用buffered image
需要速度快的,使用compatible image(因为不同的显示器,系统等支持颜色的深度都不一样,如8bit, 24bit, 32bit等)
这个需要看你的软件的应用范围,根据环境来权衡。


太感谢了。解开了我一个疑惑。thank you
4 楼 jorneyR 2011-01-10  
bitray 写道
jorneyR 写道
003 写道
呵呵,不错
有个建议,创建BufferedImage的时候最好不要直接new,这样效率会相当的差,我在做三号管家的时候,开始也是全部用的new BufferedImage,后来发现皮肤图片比较大的时候卡的一塌糊涂。
最后改用GraphicsConfiguration.createCompatibleImage来获取BufferedImage,瞬间流畅。

是的,compatible image是与硬件相关的,能够显示得更快,缺点是在不同的环境下表现得不一样。如果只是显示则用compatible image,如果是做效果处理最好是使用buffered image,因为buffered image是平台无关的。


呃,那如果仅仅是为了显示效果变好,不涉及移植什么的,是不是还是compatible image好些呢?

compatible image是根据硬件环境加快显示速度,而不是显示效果最好。
需要效果好的,使用buffered image
需要速度快的,使用compatible image(因为不同的显示器,系统等支持颜色的深度都不一样,如8bit, 24bit, 32bit等)
这个需要看你的软件的应用范围,根据环境来权衡。
3 楼 bitray 2011-01-10  
jorneyR 写道
003 写道
呵呵,不错
有个建议,创建BufferedImage的时候最好不要直接new,这样效率会相当的差,我在做三号管家的时候,开始也是全部用的new BufferedImage,后来发现皮肤图片比较大的时候卡的一塌糊涂。
最后改用GraphicsConfiguration.createCompatibleImage来获取BufferedImage,瞬间流畅。

是的,compatible image是与硬件相关的,能够显示得更快,缺点是在不同的环境下表现得不一样。如果只是显示则用compatible image,如果是做效果处理最好是使用buffered image,因为buffered image是平台无关的。


呃,那如果仅仅是为了显示效果变好,不涉及移植什么的,是不是还是compatible image好些呢?
2 楼 jorneyR 2011-01-10  
003 写道
呵呵,不错
有个建议,创建BufferedImage的时候最好不要直接new,这样效率会相当的差,我在做三号管家的时候,开始也是全部用的new BufferedImage,后来发现皮肤图片比较大的时候卡的一塌糊涂。
最后改用GraphicsConfiguration.createCompatibleImage来获取BufferedImage,瞬间流畅。

是的,compatible image是与硬件相关的,能够显示得更快,缺点是在不同的环境下表现得不一样。如果只是显示则用compatible image,如果是做效果处理最好是使用buffered image,因为buffered image是平台无关的。
1 楼 003 2011-01-10  
呵呵,不错
有个建议,创建BufferedImage的时候最好不要直接new,这样效率会相当的差,我在做三号管家的时候,开始也是全部用的new BufferedImage,后来发现皮肤图片比较大的时候卡的一塌糊涂。
最后改用GraphicsConfiguration.createCompatibleImage来获取BufferedImage,瞬间流畅。

相关推荐

    Java_swing_api_中文

    Java Swing API是Java平台上用于构建桌面应用程序用户界面的重要工具包,它是Java Foundation Classes (JFC)的一部分。这个“Java_swing_api_中文”文档详细介绍了Swing组件、事件处理、布局管理器以及其他关键功能...

    Java Swing 中文Api

    这份"Java Swing 中文Api"文档是针对中国开发者设计的,它提供了详细的中文解释,帮助开发者理解和使用Swing库。 Swing API包含了许多组件,如按钮(Button)、文本框(TextField)、标签(Label)、面板(Panel)、滚动...

    JAVA swing中文离线API文档

    本离线API文档详细阐述了Swing库中的各种组件、事件处理机制以及布局管理器等核心概念,对Java桌面开发人员来说是一份非常重要的参考资料。 在Java Swing中,开发者可以创建窗口、菜单、按钮、文本输入框等常见的...

    一个利用Java Swing实现可视化界面的扫雷小游戏.zip

    一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个...

    swing 鼠标事件 loading效果

    本篇文章将深入探讨如何在Swing应用中实现鼠标事件以及加载效果。 首先,让我们了解Swing中的鼠标事件。Swing提供了多种鼠标事件类,如`MouseEvent`, `MouseAdapter`, `MouseListener`和`MouseMotionListener`。`...

    java利用swing界面实现数独程序.zip

    在这个“java利用swing界面实现数独程序”的项目中,开发者运用了Swing来创建一个交互式的数独游戏应用。数独是一种逻辑游戏,玩家需要填充一个9x9的网格,使得每一行、每一列以及每个3x3的小宫格内的数字1到9都只...

    基于Swing技术实现“HoneyViewer”图片查看器

    HoneyViewer图片查看器是一个基于java Swing实现的图片查看器,主要实现了图片展示功能。 本实验手册根据需求完成图片读取、切换等功能,平台的全称为:基于java Swing实现的HoneyViewer图片查看器(后简称为: Keep-...

    JAVA项目-基于swing实现的图书库存管理系统

    《基于Swing实现的图书库存管理系统详解》 Java开发语言在构建桌面应用方面有着广泛的应用,Swing作为Java提供的一种图形用户界面(GUI)工具包,尤其适合开发此类系统。本项目“基于Swing实现的图书库存管理系统”...

    swing 应用框架 1.3 英文版 API

    Swing应用框架1.3英文版API是Java开发中用于构建图形用户界面(GUI)的重要工具,它基于Java Foundation Classes (JFC) 并且扩展了AWT(Abstract Window Toolkit)库,提供了更为丰富的组件和功能。这个API文档通常...

    java Swing mysql实现简单的购物系统【源码+数据库+运行指导视频】

    本项目是一套java Swing mysql实现简单的购物系统,主要针对计算机相关专业需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、运行指导视频。 项目都经过严格调试,确保可以运行! 二、技术实现 后端:...

    利用Java Swing 实现游戏开发.pdf

    ### 利用Java Swing 实现游戏开发 #### Java Swing 在游戏开发中的应用 在探讨如何使用Java Swing进行游戏开发之前,我们首先需要了解Java Swing是什么以及它为何适用于此类项目。 **Java Swing** 是一个用于创建...

    java(swing)+ mysql实现学生信息管理系统

    Java Swing + MySQL 实现学生信息管理系统知识点总结 通过对给定的文件信息,总结出以下 Java Swing + MySQL 实现学生信息管理系统的知识点: 一、Java Swing 组件 * 使用 Java Swing 组件创建图形用户界面(GUI...

    java swing mysql实现的酒店管理系统项目源码_swing_JavaSwing_酒店管理系统_

    Java Swing MySQL实现的酒店管理系统项目源码是一款基于Java图形用户界面(GUI)库Swing和关系型数据库管理系统MySQL开发的应用程序。此系统旨在为酒店提供一套全面的后台管理解决方案,涵盖了酒店日常运营中的核心...

    Swing版简单计算器

    Swing版的简单计算器,实现加减乘除,第一次写,希望大家给点建议。

    基于Java swing组件实现简易计算器

    "基于Java swing组件实现简易计算器" 本文主要介绍了基于Java swing组件实现简易计算器的知识点,以下是相关知识点的总结: 1. JFrame组件:JFrame是Java swing组件中的一种顶层容器,用于创建一个窗口框架。通过...

    Java swing mysql实现的学生选课系统项目源码

    java课程设计Java swing mysql实现的学生选课系统项目源码Java swing mysql实现的学生选课系统项目源码Java swing mysql实现的学生选课系统项目源码Java swing mysql实现的学生选课系统项目源码Java swing mysql实现...

    Java通过swing界面实现简易飞机小游戏.zip

    Java通过swing界面实现简易飞机小游戏.zipJava通过swing界面实现简易飞机小游戏.zip Java通过swing界面实现简易飞机小游戏.zipJava通过swing界面实现简易飞机小游戏.zip Java通过swing界面实现简易飞机小游戏.zip...

    swing说明说书 API

    精通 swing swing 帮助文档 eg: JBuilder启动时有一个启动画面,在Jbuilder所有的初始化工作都完成之后,启动画面消失,继而JBuilder可以开始使用。  解决方案:  该方案基于我所做过的一个项目。  1、新建...

    实时、动态的毛玻璃(aero)效果,javaSwing 实现的,用的是高斯模糊算法

    实时、动态的毛玻璃效果,javaSwing 实现的,ios7的毛玻璃效果可以让用户的注意力集中到他需要注意的地方,本demo根据之前写的例子改变而来,实现了实时、动态的毛玻璃效果,希望给有需要的人一点帮助,因为花了点...

Global site tag (gtag.js) - Google Analytics