Swing中使用方向键移动图片

开发 后端
本文主要介绍整个JFrame采用null布局,图片放在Jlabel中,实现了使用键盘上面的方向键控制图片的移动。可以选择方向为上,下,左,右,左上,左下,右上,右下等8个方向,当图片移动到窗口边缘时就不再移动。详细请看下文

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

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(2000400300);  
  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.              @Override 
  104.              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.      /**  
  131.       * 移动图片, 只处理上下左右4个方向键,其它的不处理  
  132.       *   
  133.       * @param keyCode  
  134.       *            按下的键盘上的键的键值  
  135.       */ 
  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 < 0 
  171.                  || 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.cnblogs.com/hyjiacan/archive/2012/05/02/swing-move-image-via-keyboard.html

【编辑推荐】

  1. Java程序设计:图形与多媒体处理
  2. Java集合框架总结:TreeSet类的排序问题
  3. Java理论与实践: Web层的状态复制
  4. Java图形界面开发:高级Swing容器(三)
  5. Java图形界面开发:高级Swing容器(二)
责任编辑:林师授 来源: hyjiacan的博客
相关推荐

2020-05-22 16:27:03

笔记本键盘尺寸

2009-12-25 13:58:15

LINUX光标移动

2012-03-16 09:35:52

HTML 5

2021-02-05 09:18:33

VS CodeVim操作

2012-04-01 10:02:00

HTML5

2022-09-26 12:28:16

OpenGLAPI使用移动应用

2009-07-15 11:19:17

invokeLaterSwing

2022-07-31 15:41:03

Linux

2011-06-14 13:07:54

Qt 图片

2013-01-07 10:37:10

移动游戏本地游戏桌游

2010-09-30 14:11:41

JSIE6.0

2016-05-18 14:20:12

LinuxgThumb图片

2019-12-13 09:45:38

Windows 10PowerToysWindows

2011-08-16 10:19:24

timeconfig中文man

2021-02-20 18:00:26

rangerLinux

2012-06-14 16:04:56

移动端图片分享

2013-11-06 08:48:41

异构计算移动计算

2012-11-27 10:52:23

移动支付平台

2010-07-21 15:16:08

SQL Server

2011-07-26 09:48:47

Shell快捷键grepinit
点赞
收藏

51CTO技术栈公众号