溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-10-29 15:56:43 來(lái)源:億速云 閱讀:152 作者:柒染 欄目:編程語(yǔ)言

Swing中怎么使用方向鍵移動(dòng)圖片,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

整個(gè)JFrame采用null布局,圖片放在Jlabel中,實(shí)現(xiàn)了使用鍵盤(pán)上面的方向鍵控制圖片的移動(dòng)??梢赃x擇方向?yàn)樯?,下,左,右,左上,左下,右上,右下?個(gè)方向,當(dāng)圖片移動(dòng)到窗口邊緣時(shí)就不再移動(dòng)。

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

KEY枚舉:根據(jù)按鍵結(jié)果得到的移動(dòng)方向

HORIZION枚舉:鍵盤(pán)上按下的左右方向鍵(左、右)

VERTICAL枚舉:鍵盤(pán)上按下的上下方向鍵(上、下)

STEP:圖片響應(yīng)按鍵時(shí)移動(dòng)的單位

怎么響應(yīng)兩個(gè)鍵?

若一個(gè)鍵按下(發(fā)出press事件)后沒(méi)有彈起(未發(fā)出release事件)時(shí),按下了另一個(gè)鍵(發(fā)出press事件),此時(shí)就是兩個(gè)鍵同時(shí)按下了。

由于按鍵由程序的枚舉量記錄,當(dāng)按下相反方向鍵時(shí)(不是同時(shí)按住,也就是說(shuō)按一個(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)鍵盤(pán)上的鍵按下事件           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        *            按下的鍵盤(pán)上的鍵的鍵值        */      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();       }   }

遺留問(wèn)題:

在同時(shí)按住上下或者左右方向時(shí),圖片會(huì)朝著后面按下的那個(gè)方向鍵指定的方向移動(dòng)(理論上此時(shí)應(yīng)該不動(dòng)的)

在同時(shí)按住兩個(gè)方向鍵移動(dòng)時(shí),圖片會(huì)先移動(dòng)一下,然后會(huì)頓一下,再繼續(xù)移動(dòng)。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI