淘先锋技术网

首页 1 2 3 4 5 6 7

[Java教程]Swing中使用方向键移动图片

0 2012-05-02 12:00:09

整个JFrame采用null布局,图片放在Jlabel中,实现了使用键盘上面的方向键控制图片的移动。可以选择方向为上,下,左,右,左上,左下,右上,右下等8个方向,当图片移动到窗口边缘时就不再移动。

bc91bb04e6e9c61e24c974e4440db8f2.gif

KEY枚举:根据按键结果得到的移动方向

HORIZION枚举:键盘上按下的左右方向键(左、右)

VERTICAL枚举:键盘上按下的上下方向键(上、下)

STEP:图片响应按键时移动的单位

怎么响应两个键?

若一个键按下(发出press事件)后没有弹起(未发出release事件)时,按下了另一个键(发出press事件),此时就是两个键同时按下了。

由于按键由程序的枚举量记录,当按下相反方向键时(不是同时按住,也就是说按一个键后弹起了再按另一个),需要将前一次按下的方向记录清除(如:先按了左,然后再按右,此时将左的记录清除)。

1 package com.cnblogs.hyjiacan; 2 3 import java.awt.Color; 4 import java.awt.Point; 5 import java.awt.event.KeyAdapter; 6 import java.awt.event.KeyEvent; 7 8 import javax.swing.Icon; 9 import javax.swing.ImageIcon; 10 import javax.swing.JFrame; 11 import javax.swing.JLabel; 12 13 enum KEY { 14 UP, RIGHT, DOWN, LEFT, RIGHT_UP, RIGHT_DOWN, LEFT_UP, LEFT_DOWN 15 } 16 17 enum HORIZION { 18 LEFT, RIGHT 19 } 20 21 enum VERTICAL { 22 UP, DOWN 23 } 24 25 public class MoveImage { 26 JFrame win; 27 Icon img; 28 JLabel lb; 29 static final int STEP = 2; 30 KEY key; 31 HORIZION hor; 32 VERTICAL ver; 33 34 public MoveImage() { 35 hor = null; 36 ver = null; 37 38 win = new JFrame("MoveImage"); 39 win.setLayout(null); 40 // 加载图片 41 img = new ImageIcon(getClass().getResource("img.gif")); 42 lb = new JLabel(); 43 lb.setSize(img.getIconWidth(), img.getIconHeight()); 44 // 装载图片 45 lb.setIcon(img); 46 47 win.setBounds(200, 0, 400, 300); 48 // 响应键盘上的键按下事件 49 win.addKeyListener(new KeyAdapter() { 50 // 键值临时量 51 int k; 52 53 @Override 54 public void keyPressed(KeyEvent e) { 55 k = e.getKeyCode(); 56 57 switch (k) { 58 case KeyEvent.VK_UP: 59 ver = VERTICAL.UP; 60 break; 61 case KeyEvent.VK_DOWN: 62 ver = VERTICAL.DOWN; 63 break; 64 case KeyEvent.VK_RIGHT: 65 hor = HORIZION.RIGHT; 66 break; 67 case KeyEvent.VK_LEFT: 68 hor = HORIZION.LEFT; 69 break; 70 } 71 if (ver == null) { 72 if (hor == HORIZION.RIGHT) { 73 key = KEY.RIGHT; 74 } else { 75 key = KEY.LEFT; 76 } 77 78 } else if (hor == null) { 79 if (ver == VERTICAL.UP) { 80 key = KEY.UP; 81 } else { 82 key = KEY.DOWN; 83 } 84 } else { 85 if (hor == HORIZION.RIGHT) { 86 if (ver == VERTICAL.UP) { 87 key = KEY.RIGHT_UP; 88 } else { 89 key = KEY.RIGHT_DOWN; 90 } 91 } else { 92 if (ver == VERTICAL.UP) { 93 key = KEY.LEFT_UP; 94 } else { 95 key = KEY.LEFT_DOWN; 96 } 97 } 98 } 99 100 move(key);101 }102 103 @Override104 public void keyReleased(KeyEvent e) {105 k = e.getKeyCode();106 switch (k) {107 case KeyEvent.VK_UP:108 ver = null;109 break;110 case KeyEvent.VK_DOWN:111 ver = null;112 break;113 case KeyEvent.VK_RIGHT:114 hor = null;115 break;116 case KeyEvent.VK_LEFT:117 hor = null;118 break;119 }120 }121 });122 123 win.add(lb);124 win.getContentPane().setBackground(Color.WHITE);125 win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);126 win.setVisible(true);127 win.validate();128 }129 130 136 void move(KEY key) {137 // 记下当前的位置138 Point pos = lb.getLocation();139 switch (key) {140 case UP:// 上方向141 pos.y -= STEP;142 break;143 case RIGHT:// 右方向144 pos.x += STEP;145 break;146 case DOWN:// 下方向147 pos.y += STEP;148 break;149 case LEFT:// 左方向150 pos.x -= STEP;151 break;152 case RIGHT_UP:// 右上方向153 pos.x += STEP;154 pos.y -= STEP;155 break;156 case RIGHT_DOWN:// 右下方向157 pos.x += STEP;158 pos.y += STEP;159 break;160 case LEFT_DOWN:// 左下方向161 pos.x -= STEP;162 pos.y += STEP;163 break;164 case LEFT_UP:// 左上方向165 pos.x -= STEP;166 pos.y -= STEP;167 break;168 }169 // 是否移动到了边缘170 if (pos.x >= win.getWidth() - lb.getWidth() || pos.x < 0171 || pos.y >= win.getHeight() - lb.getHeight() || pos.y < 0)172 return;173 // 设置新位置174 lb.setLocation(pos);175 lb.validate();176 }177 178 public static void main(String[] args) {179 MoveImage m = new MoveImage();180 }181 }

遗留问题:

在同时按住上下或者左右方向时,图片会朝着后面按下的那个方向键指定的方向移动(理论上此时应该不动的)

在同时按住两个方向键移动时,图片会先移动一下,然后会顿一下,再继续移动 本文网址:http://www.shaoqun.com/a/28878.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:[email protected]

win

0