十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
Swing中怎么使用方向鍵移動(dòng)圖片,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
公司專注于為企業(yè)提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、成都商城網(wǎng)站開(kāi)發(fā),微信小程序開(kāi)發(fā),軟件按需策劃設(shè)計(jì)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。
整個(gè)JFrame采用null布局,圖片放在Jlabel中,實(shí)現(xiàn)了使用鍵盤上面的方向鍵控制圖片的移動(dòng)。可以選擇方向?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事件)后沒(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)鍵盤上的鍵按下事件 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 * 按下的鍵盤上的鍵的鍵值 */ 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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。