您好,登錄后才能下訂單哦!
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)。
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ì)億速云的支持。
免責(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)容。