自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Swing中使用方向鍵移動(dòng)圖片

開發(fā) 后端
本文主要介紹整個(gè)JFrame采用null布局,圖片放在Jlabel中,實(shí)現(xiàn)了使用鍵盤上面的方向鍵控制圖片的移動(dòng)??梢赃x擇方向?yàn)樯?,下,左,右,左上,左下,右上,右下?個(gè)方向,當(dāng)圖片移動(dòng)到窗口邊緣時(shí)就不再移動(dòng)。詳細(xì)請(qǐ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í)將左的記錄清除)。

  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.          // 響應(yīng)鍵盤上的鍵按下事件  
  49.          win.addKeyListener(new KeyAdapter() {  
  50.              // 鍵值臨時(shí)量  
  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.       * 移動(dòng)圖片, 只處理上下左右4個(gè)方向鍵,其它的不處理  
  132.       *   
  133.       * @param keyCode  
  134.       *            按下的鍵盤上的鍵的鍵值  
  135.       */ 
  136.      void move(KEY key) {  
  137.          // 記下當(dāng)前的位置  
  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.          // 是否移動(dòng)到了邊緣  
  170.          if (pos.x >= win.getWidth() - lb.getWidth() || pos.x < 0 
  171.                  || pos.y >= win.getHeight() - lb.getHeight() || pos.y < 0)  
  172.              return;  
  173.          // 設(shè)置新位置  
  174.          lb.setLocation(pos);  
  175.          lb.validate();  
  176.      }  
  177.    
  178.      public static void main(String[] args) {  
  179.          MoveImage m = new MoveImage();  
  180.      }  
  181.  } 

遺留問題:

在同時(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

【編輯推薦】

  1. Java程序設(shè)計(jì):圖形與多媒體處理
  2. Java集合框架總結(jié):TreeSet類的排序問題
  3. Java理論與實(shí)踐: Web層的狀態(tài)復(fù)制
  4. Java圖形界面開發(fā):高級(jí)Swing容器(三)
  5. Java圖形界面開發(fā):高級(jí)Swing容器(二)
責(zé)任編輯:林師授 來源: hyjiacan的博客
相關(guān)推薦

2020-05-22 16:27:03

筆記本鍵盤尺寸

2009-12-25 13:58:15

LINUX光標(biāo)移動(dòng)

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使用移動(dòng)應(yīng)用

2009-07-15 11:19:17

invokeLaterSwing

2022-07-31 15:41:03

Linux

2011-06-14 13:07:54

Qt 圖片

2016-05-18 14:20:12

LinuxgThumb圖片

2010-09-30 14:11:41

JSIE6.0

2019-12-13 09:45:38

Windows 10PowerToysWindows

2011-08-16 10:19:24

timeconfig中文man

2013-01-07 10:37:10

移動(dòng)游戲本地游戲桌游

2021-02-20 18:00:26

rangerLinux

2010-07-21 15:16:08

SQL Server

2012-06-14 16:04:56

移動(dòng)端圖片分享

2013-11-06 08:48:41

異構(gòu)計(jì)算移動(dòng)計(jì)算

2012-11-27 10:52:23

移動(dòng)支付平臺(tái)

2011-07-26 09:48:47

Shell快捷鍵grepinit
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)