您好,登錄后才能下訂單哦!
Swing中怎么使用方向鍵移動圖片,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
整個JFrame采用null布局,圖片放在Jlabel中,實現了使用鍵盤上面的方向鍵控制圖片的移動。可以選擇方向為上,下,左,右,左上,左下,右上,右下等8個方向,當圖片移動到窗口邊緣時就不再移動。
KEY枚舉:根據按鍵結果得到的移動方向
HORIZION枚舉:鍵盤上按下的左右方向鍵(左、右)
VERTICAL枚舉:鍵盤上按下的上下方向鍵(上、下)
STEP:圖片響應按鍵時移動的單位
怎么響應兩個鍵?
若一個鍵按下(發出press事件)后沒有彈起(未發出release事件)時,按下了另一個鍵(發出press事件),此時就是兩個鍵同時按下了。
由于按鍵由程序的枚舉量記錄,當按下相反方向鍵時(不是同時按住,也就是說按一個鍵后彈起了再按另一個),需要將前一次按下的方向記錄清除(如:先按了左,然后再按右,此時將左的記錄清除)。
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); // 響應鍵盤上的鍵按下事件 win.addKeyListener(new KeyAdapter() { // 鍵值臨時量 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(); } /** * 移動圖片, 只處理上下左右4個方向鍵,其它的不處理 * * @param keyCode * 按下的鍵盤上的鍵的鍵值 */ void move(KEY key) { // 記下當前的位置 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; } // 是否移動到了邊緣 if (pos.x >= win.getWidth() - lb.getWidth() || pos.x < 0 || pos.y >= win.getHeight() - lb.getHeight() || pos.y < 0) return; // 設置新位置 lb.setLocation(pos); lb.validate(); } public static void main(String[] args) { MoveImage m = new MoveImage(); } }
遺留問題:
在同時按住上下或者左右方向時,圖片會朝著后面按下的那個方向鍵指定的方向移動(理論上此時應該不動的)
在同時按住兩個方向鍵移動時,圖片會先移動一下,然后會頓一下,再繼續移動。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。