很多主一听说Java界面,一水的头大外带血压高,兄弟我倒觉得没什么必要。
     
    其实Java这东西吧,就简便性和其初衷而言,真他妈就在GUI 这地界是有优势的,单就其2D界面开发的易用性来说,借用《地下交通站》里黑瞎子——黑藤太君骂贾队长的话来说“全中国,不,全东亚,还能找出你这样空前 绝后的脸吗?”。所以它不普及,无外两点,1.搞Java的多半不指着这东西混饭吃,比如兄弟目前还被逼用 SSH(Struts+Spring+Hibernate)混饭吃。2.效率低,为了改变本来AWT的可移植性而开发Swing,结果搞得层次过多,效率 低下,反倒是走回AWT老路的SWT比较吃香,害得SUN从1.6开始又给AWT扩充新类,谁让Swing玩底层要靠AWT的……

兄弟不才,大家也碰上个愣主,我就准备以闲扯的方式鼓捣鼓捣这爹不亲娘不爱的玩意。

既然提到UI,那怎么也得有图像吧?图像,再次也得弄张图来操作吧?所以咱爷们就先从Java图像的加载入手,操练起来~

package org.test;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;

/**
 * <p>
 * Title: 史上最扯Java图形绘制(J2SE)教程之一,图像变换。
 * </p>
 * <p>
 * Description:图像变换
 * </p>
 * <p>
 * Copyright: Copyright (c) 2007
 * </p>
 * 
 * @author chenpeng
 * @email:[email]ceponline@yahoo.com.cn[/email]
 * @version 0.1
 */
public class SimpleAnime extends Frame {

/**
     * 这个例子我用AWT来讲解,实际上,我们都知道使用Swing时,对图 像绘制上有很多的优化,但是在AWT中,这些都是要我们手动来做得,
     * 所以入门我还是以AWT开始。(其实大家都知道,组件名加个J就变 Swing了……几乎不用改别的。)
     */

private static final long serialVersionUID = 1L;

// 用于存储图片
    Image act;

// 俗称的帆布啦,做手机开发的话很常见
    Canvas canvas = new Canvas() {

private static final long serialVersionUID = 1L;

/**
         * 绘制图像,直接调用update方法(顺便说一下,若以paint调用update,
         * 再用update调用paint,会出现很好玩的事。^^)
         */
        public void paint(Graphics g) {
            update(g);
        }

/**
         * 此方法仅在在发生变更时绘制图形
         */
        public void update(Graphics g) {
            // 参数分别为加载图像,所在Graphics上的left,所在top,图像width,图像height,目标对象
            g.drawImage(act, getWidth() / 2 - act.getWidth(null) / 2,
                    getHeight() / 2 - act.getHeight(null) / 2, act
                            .getWidth(null), act.getHeight(null), this);
        }
    };

/**
     * 简单动画的构造
     * 
     */
    public SimpleAnime() {
        setTitle("图像变换");
        setSize(400, 400);
        // 设定背景为黑色
        setBackground(Color.BLACK);
        // 直接以class路径读取图片资源
        URL imageUrl = getClass().getResource("/image/act.jpg");
        // 获取image图像实体
        act = Toolkit.getDefaultToolkit().createImage(imageUrl);
        // 加载帆布作为背景
        add(canvas);
        class AnimeMouseListener extends MouseAdapter {
            // 鼠标进入变更
            public void mouseEntered(MouseEvent e) {
                // 顺便说一下,水平反转图的效果,是可以用代码做到的,后面讲解。
                URL imageUrl = getClass().getResource("/image/act0.jpg");
                act = Toolkit.getDefaultToolkit().createImage(imageUrl);
                canvas.repaint();
            }

// 鼠标离开变更
            public void mouseExited(MouseEvent e) {
                URL imageUrl = getClass().getResource("/image/act.jpg");
                act = Toolkit.getDefaultToolkit().createImage(imageUrl);
                canvas.repaint();
            }
        }
        //在帆布上添加鼠标监听
        canvas.addMouseListener(new AnimeMouseListener());
    }

/**
     * 主函数
     * 
     * @param args
     */
    public static void main(String[] args) {
        // 实例化本类
        SimpleAnime sa = new SimpleAnime();
        // 显示窗体
        sa.setVisible(true);
    }
}
(鼠标移入)

(鼠标在外)

这他妈才几个字母,抛除我那些狗屁都未必同通得了的注释,不到俩半字,这日本的花姑娘(正经说一句,这是月姬的同人图……)就给小爷跳上舞了,那位缺德主要加个死循环的线程进去,嘿,不赶上停电死机的,还就真格停不下来了。

闲得无聊,丧心病狂的我给加上个线程。

package org.test;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
/**
 * @author chenpeng
 * @email:[email]ceponline@yahoo.com.cn[/email]
 * @version 0.1
 */
public class SimpleAnime0 extends Frame {

private static final long serialVersionUID = 1L;

Image act1;

Image act2;

// 是否令图像移动

boolean actMoving = false;

// 初始图像编号

int actPhase = 1;

Canvas c = new Canvas() {

private static final long serialVersionUID = 1L;

/**
         * 绘制图像,直接调用update方法(顺便说一下,若以paint调用update, 再用update调用paint,会出现很好玩的事。^^)
         */
        public void paint(Graphics g) {
            update(g);
        }

/**
         * 此方法仅在在发生变更时绘制图形
         */
        public void update(Graphics g) {
            if (actMoving) {
                if (actPhase == 1) {
                    g
                            .drawImage(act1, getWidth() / 2
                                    - act1.getWidth(null) / 2, getHeight() / 2
                                    - act1.getHeight(null) / 2, act1
                                    .getWidth(null), act1.getHeight(null), this);
                } else {
                    g
                            .drawImage(act2, getWidth() / 2
                                    - act2.getWidth(null) / 2, getHeight() / 2
                                    - act2.getHeight(null) / 2, act2
                                    .getWidth(null), act2.getHeight(null), this);
                }
            }
        }
    };

/**
     * 简单动画的构造
     * 
     */
    public SimpleAnime0(boolean isRun) {
        actMoving = isRun;
        setTitle("图像变换");
        setSize(400, 400);
        // 设定背景为黑色
        setBackground(Color.BLACK);
        //这只是一个图像加载的演示,我们完全可以定义一个Image数组,然后动态加载
        //做成动画播放。
        URL imageUrl = getClass().getResource("/image/act.jpg");
        act1 = Toolkit.getDefaultToolkit().createImage(imageUrl);
        imageUrl = getClass().getResource("/image/act0.jpg");
        act2 = Toolkit.getDefaultToolkit().createImage(imageUrl);
        add(c);

/**
         * 顺便介绍一下,在Swing下有Timer类,可以设定运算周期循环触发事件。 大体写法如下,不过很多人还是愿意用线程……
         * 
         * class TimerListener implements ActionListener{ public void
         * actionPerformed(ActionEvent e){ if(!actMoving) return; actPhase =
         * (actPhase == 1) ? 2 : 1; canvas.repaint(); } } javax.swing.Timer t =
         * new javax.swing.Timer(200,new TimerListener()); t.start();
         */

Thread t = new Thread(new Timer());
        t.start();
    }

/**
     * 事件循环处理线程
     * 
     * @author chenpeng
     */
    class Timer implements Runnable {
        public void run() {
            while (true) {
                if (!actMoving)
                    return;
                actPhase = (actPhase == 1) ? 2 : 1;
                c.repaint();
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {

e.printStackTrace();
                }
            }
        }
    }

/**
     * 主函数
     * 
     * @param args
     */
    public static void main(String[] args) {
        // 实例化本类,并触发循环事件
        SimpleAnime0 sa = new SimpleAnime0(true);
        // 显示窗体
        sa.setVisible(true);
    }

}

本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/130224

史上最扯Java图形绘制(J2SE)之一JAVA动画效果相关推荐

  1. css3绘制八卦图及动画效果

    原理很简单,就是外面加个盒子box.作为旋转动画的box,然后里面分别利用两个div使用css3的 border-radius绘制半圆,分别定位在上下中间对齐两个位置,里面在放两个小的原点水平和垂直方 ...

  2. “史上最全”Spring Boot详解!java程序员细节到极致的一次,魔鬼

    这本书的灵感 当时公司的技术栈全面转入Spring Boot体系,源于本书作者在公司的一次分享会上的分享.当时作者用了不到10分钟就使用Spring Boot轻松制作了一个功能完整的数据增加.删除.修 ...

  3. java图形界面制作表格,Java自学-图形界面 表格

    Swing 使用 JTable详解 示例 1 : 基本表格 显示一个Table需要两组数据 一维数组: String[]columnNames 表示表格的标题 二维数组: String[][] her ...

  4. java动态图片_java实现gif动画效果(java显示动态图片)

    关闭 关闭 java实现gif动画效果(java显示动态图片) 作者: 字体:[增加 减小] 类型:转载 时间:2014-04-29我要评论 这篇文章主要介绍了java实现gif动画效果示例(java ...

  5. java 图形绘制_Java Graphics 图形绘制

    Graphics类提供基本绘图方法,Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形.画字符串等. 画线段 drawLine pub ...

  6. 仿掌上英雄联盟能力值图形绘制

    一,前沿 相信玩撸啊撸的撸友们一定记得掌上英雄联盟App的能力值吧~~ 好吧,不记得没关系我来给大家上张图! ! 所以今天呢我就抽出时间模仿了一下: 照例线来张GIF,有图有真相 以下是我的微博账号希 ...

  7. 【史上最强实战项目合集】java项目20套 +完整版java学习视频

    如果你是初学者,或者是自学者!你可以加小编微信(2782278837)!小编可以给你一些好的建议以及给你(免费)提供学习资料!你在学习上有什么问题都可以咨询小编!小编都会为你解答! 注:本公众号纯属个 ...

  8. 史上最全 JVM 大全详解、java 程序员细节到极致的一次,魔鬼

    前言 作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识. JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准.而大多数人可能没有对 JVM 的实际 ...

  9. 史上最全 JVM 大全详解!java 程序员细节到极致的一次,魔鬼

    前言 作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识. JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准.而大多数人可能没有对 JVM 的实际 ...

最新文章

  1. 怎么设计计算机网络共享,如何设置网络共享 网络共享设置方法【详解】
  2. 26.angularJS $routeProvider
  3. httpclient get post
  4. 宜信开源|详解PaaS平台LAIN的功能和架构
  5. Windows 技术篇-任务管理器查看执行进程的程序所在位置方法,查看执行进程的命令行
  6. LinkedList集合
  7. shell之什么时候使用shell以及最简单的shell程序
  8. 无法打开物理文件 XXX.mdf,操作系统错误 5.5(拒绝访问) 的解决办法
  9. 【EXLIBRIS】纸版书目整理 -- 大书架 下 【64 种】【103 册】
  10. GARFIELD@01-01-2005
  11. 【iOS】UIViewController、UINavigationController与UITabBarController的整合使用
  12. 升级CentOS到最新版本
  13. 静默安装oracle11,Oracle11g静默安装
  14. Mac OS读写NTFS
  15. python编程输入名字配对情侣网名_输入名字查另一半名字,怎样用一半情侣网名查...
  16. 设置二级域名解析到同IP不同端口
  17. pwnable.kr unlink
  18. 多元线性方程的python解法
  19. unity scripting backend mono vs il2cpp
  20. latex自动编译 (ubuntu/win)

热门文章

  1. mongoose 使用总结
  2. 在Ubuntu虚拟机中安装VMware tools异常中断
  3. 怎样获得listview的第一个item?
  4. Sharepoint 2007 定制Feature和卸载Feature
  5. 共享单车哈罗王炸连出,OFO小心沦为炮灰
  6. Linux常用命令集合
  7. 关于Installshield里一些常见问题的解答—艾泽拉斯之海洋女神出品
  8. java+flash在线拍照和编辑,保存到服务器(Spring3.2.2+swf+jquery)
  9. 如何弹出UIDatePicker最好
  10. 比特币现金BCH 硬分叉,能否突破$1500?