很多主一聽說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:ceponline@yahoo.com.cn
* @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:ceponline@yahoo.com.cn
* @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);
}
}
其實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:ceponline@yahoo.com.cn
* @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:ceponline@yahoo.com.cn
* @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);
}
}
浙公網安備 33010602011771號