前两天,有一个小姑娘让帮忙给其写一个小玩意,就是在Panel上绘制一个图片,然后通过键盘的方向键进行控制移动。虽然比较简单,这里还是希望和大家分享一下,里面有两点特别需要注意的知识点,这里一并加以说明。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.wst;
/**
*
* @author Administrator
*/
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.p_w_picpath.BufferedImage;
import javax.swing.*;
public class ImageMove extends JFrame {
private Container content;
private JPanel firstPicturePane;
private JPanel secondPicturePane;
private final static int WIDTH = 600;
private final static int HEIGHT = 600;
protected Image bfImage;
protected Graphics g;
protected int ImageX = 0;
protected int ImageY = 0;
protected int ImageW = 200;
protected int ImageH = 300;
private JPanel mainPane;
public void setImageX(int ImageX) {
this.ImageX = ImageX;
}
public int getImageX() {
return ImageX;
}
public void setImageY(int ImageY) {
this.ImageY = ImageY;
}
public int getImageY() {
return ImageY;
}
public Graphics getGra() {
return g;
}
public ImageMove() throws Exception {
super();
this.setTitle("键盘操作图片移动演示");
content = this.getContentPane();
firstPicturePane = new JPanel();
secondPicturePane = new JPanel();
content.setLayout(new BorderLayout());
content.add(firstPicturePane, BorderLayout.CENTER);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int h = screenSize.height;
int w = screenSize.width;
int x = (w - WIDTH) / 2;
int y = (h - HEIGHT) / 2;
this.setLocation(x, y);
this.setSize(WIDTH, HEIGHT);
bfImage = Toolkit.getDefaultToolkit().getImage("http_imgloadCACVTPTR.jpg");
this.setVisible(true);
g = firstPicturePane.getGraphics();
if (g == null) {
System.out.println("gg is null");
} else {
System.out.println(bfImage.toString());
MediaTracker t = new MediaTracker(this);
t.addImage(bfImage, 0);
t.waitForAll();
g.drawImage(bfImage, ImageX, ImageY, ImageW, ImageH, this);
}
addKeyListener(new MyKeyListener());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class MyKeyListener implements KeyListener {
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
g.drawImage(bfImage, ImageX, ImageY, ImageW, ImageH, null);
g.clearRect(ImageX, ImageY, ImageW, ImageH);
// repaint(ImageX, ImageY, ImageW, ImageH);
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
ImageX -= ((ImageX - 15) >= 0 ? 15 : ImageX);
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
ImageX += ((ImageX + ImageW + 15) <= WIDTH ? 15 : (WIDTH - ImageX - ImageW));
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
ImageY -= ((ImageY - 15) >= 0 ? 15 : ImageY);
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
ImageY += ((ImageY + ImageH + 15) <= HEIGHT ? 15 : (HEIGHT - ImageY - ImageH));
}
g.drawImage(bfImage, ImageX, ImageY, ImageW, ImageH, null);
}
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
System.out.println(c);
}
}
public static void main(String[] args) throws Exception {
new ImageMove();
}
}
这里有两点需要特别强调:
1、对于键盘事件进行监听时,对于键盘上的字母键和数字键,可以通过getChar获得,但对于一些功能键和方向键,则必须在pressed和releasd里进行通过getHasCode进行监听和操作,这里可以简单地理解为前者执行高层操作,后者执行较底层操作。
2、在面板上绘制图片的时候,可能会出现代码没问题但图片不能显示的问题,那是因为图片可能未加载完成,这里可以通过如下代码加以控制:
MediaTracker t = new MediaTracker(this);
t.addImage(bfImage, 0);
t.waitForAll();