Swing中使用方向鍵移動(dòng)圖片
整個(gè)JFrame采用null布局,圖片放在Jlabel中,實(shí)現(xiàn)了使用鍵盤上面的方向鍵控制圖片的移動(dòng)??梢赃x擇方向?yàn)樯?,下,左,右,左上,左下,右上,右下?個(gè)方向,當(dāng)圖片移動(dòng)到窗口邊緣時(shí)就不再移動(dòng)。
KEY枚舉:根據(jù)按鍵結(jié)果得到的移動(dòng)方向
HORIZION枚舉:鍵盤上按下的左右方向鍵(左、右)
VERTICAL枚舉:鍵盤上按下的上下方向鍵(上、下)
STEP:圖片響應(yīng)按鍵時(shí)移動(dòng)的單位
怎么響應(yīng)兩個(gè)鍵?
若一個(gè)鍵按下(發(fā)出press事件)后沒有彈起(未發(fā)出release事件)時(shí),按下了另一個(gè)鍵(發(fā)出press事件),此時(shí)就是兩個(gè)鍵同時(shí)按下了。
由于按鍵由程序的枚舉量記錄,當(dāng)按下相反方向鍵時(shí)(不是同時(shí)按住,也就是說按一個(gè)鍵后彈起了再按另一個(gè)),需要將前一次按下的方向記錄清除(如:先按了左,然后再按右,此時(shí)將左的記錄清除)。
- package com.cnblogs.hyjiacan;
- import java.awt.Color;
- import java.awt.Point;
- import java.awt.event.KeyAdapter;
- import java.awt.event.KeyEvent;
- import javax.swing.Icon;
- import javax.swing.ImageIcon;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- enum KEY {
- UP, RIGHT, DOWN, LEFT, RIGHT_UP, RIGHT_DOWN, LEFT_UP, LEFT_DOWN
- }
- enum HORIZION {
- LEFT, RIGHT
- }
- enum VERTICAL {
- UP, DOWN
- }
- public class MoveImage {
- JFrame win;
- Icon img;
- JLabel lb;
- static final int STEP = 2;
- KEY key;
- HORIZION hor;
- VERTICAL ver;
- public MoveImage() {
- hor = null;
- ver = null;
- win = new JFrame("MoveImage");
- win.setLayout(null);
- // 加載圖片
- img = new ImageIcon(getClass().getResource("img.gif"));
- lb = new JLabel();
- lb.setSize(img.getIconWidth(), img.getIconHeight());
- // 裝載圖片
- lb.setIcon(img);
- win.setBounds(200, 0, 400, 300);
- // 響應(yīng)鍵盤上的鍵按下事件
- win.addKeyListener(new KeyAdapter() {
- // 鍵值臨時(shí)量
- int k;
- @Override
- public void keyPressed(KeyEvent e) {
- k = e.getKeyCode();
- switch (k) {
- case KeyEvent.VK_UP:
- ver = VERTICAL.UP;
- break;
- case KeyEvent.VK_DOWN:
- ver = VERTICAL.DOWN;
- break;
- case KeyEvent.VK_RIGHT:
- hor = HORIZION.RIGHT;
- break;
- case KeyEvent.VK_LEFT:
- hor = HORIZION.LEFT;
- break;
- }
- if (ver == null) {
- if (hor == HORIZION.RIGHT) {
- key = KEY.RIGHT;
- } else {
- key = KEY.LEFT;
- }
- } else if (hor == null) {
- if (ver == VERTICAL.UP) {
- key = KEY.UP;
- } else {
- key = KEY.DOWN;
- }
- } else {
- if (hor == HORIZION.RIGHT) {
- if (ver == VERTICAL.UP) {
- key = KEY.RIGHT_UP;
- } else {
- key = KEY.RIGHT_DOWN;
- }
- } else {
- if (ver == VERTICAL.UP) {
- key = KEY.LEFT_UP;
- } else {
- key = KEY.LEFT_DOWN;
- }
- }
- }
- move(key);
- }
- @Override
- public void keyReleased(KeyEvent e) {
- k = e.getKeyCode();
- switch (k) {
- case KeyEvent.VK_UP:
- ver = null;
- break;
- case KeyEvent.VK_DOWN:
- ver = null;
- break;
- case KeyEvent.VK_RIGHT:
- hor = null;
- break;
- case KeyEvent.VK_LEFT:
- hor = null;
- break;
- }
- }
- });
- win.add(lb);
- win.getContentPane().setBackground(Color.WHITE);
- win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- win.setVisible(true);
- win.validate();
- }
- /**
- * 移動(dòng)圖片, 只處理上下左右4個(gè)方向鍵,其它的不處理
- *
- * @param keyCode
- * 按下的鍵盤上的鍵的鍵值
- */
- void move(KEY key) {
- // 記下當(dāng)前的位置
- Point pos = lb.getLocation();
- switch (key) {
- case UP:// 上方向
- pos.y -= STEP;
- break;
- case RIGHT:// 右方向
- pos.x += STEP;
- break;
- case DOWN:// 下方向
- pos.y += STEP;
- break;
- case LEFT:// 左方向
- pos.x -= STEP;
- break;
- case RIGHT_UP:// 右上方向
- pos.x += STEP;
- pos.y -= STEP;
- break;
- case RIGHT_DOWN:// 右下方向
- pos.x += STEP;
- pos.y += STEP;
- break;
- case LEFT_DOWN:// 左下方向
- pos.x -= STEP;
- pos.y += STEP;
- break;
- case LEFT_UP:// 左上方向
- pos.x -= STEP;
- pos.y -= STEP;
- break;
- }
- // 是否移動(dòng)到了邊緣
- if (pos.x >= win.getWidth() - lb.getWidth() || pos.x < 0
- || pos.y >= win.getHeight() - lb.getHeight() || pos.y < 0)
- return;
- // 設(shè)置新位置
- lb.setLocation(pos);
- lb.validate();
- }
- public static void main(String[] args) {
- MoveImage m = new MoveImage();
- }
- }
遺留問題:
在同時(shí)按住上下或者左右方向時(shí),圖片會(huì)朝著后面按下的那個(gè)方向鍵指定的方向移動(dòng)(理論上此時(shí)應(yīng)該不動(dòng)的)
在同時(shí)按住兩個(gè)方向鍵移動(dòng)時(shí),圖片會(huì)先移動(dòng)一下,然后會(huì)頓一下,再繼續(xù)移動(dòng)。
原文鏈接:http://www.cnblogs.com/hyjiacan/archive/2012/05/02/swing-move-image-via-keyboard.html
【編輯推薦】