51,407
社区成员
发帖
与我相关
我的任务
分享import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Move extends JPanel {
private int x = 80;
private int y = 80;
private int speed = 10;
public Move() {
setFocusable(true); // [[1]] JPanel 默认是得不到焦点的,这里设置 JPanel 可以得到焦点
requestFocus();
addKeyListener(new KeyAdapter() {
public void keyPressed( KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_W) {
y=y-speed;
System.out.println("\n Go Up");
repaint();
} else if(e.getKeyChar()==KeyEvent.VK_S) {
y=y+speed;
System.out.println("\n Go Down");
repaint();
} else if(e.getKeyCode()==KeyEvent.VK_A) {
x=x-speed;
System.out.println("\n Go Left");
repaint();
} else if(e.getKeyCode()==KeyEvent.VK_D) {
System.out.println("\n Go Right");
x=x+speed;
repaint();
} else {
System.out.println(e.getKeyChar());
}
}
});
}
// [[2]] 不要在 JFrame 或者 任意的 JComponent 及其子类的 paint() 方法里绘制
// 绘制要用在 paintComponent() 里,因为 JPanel 提供了双缓冲的功能
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillRect(x, y, 40, 40);
}
private static void createAndShowGui() {
JFrame frame = new JFrame();
frame.getContentPane().add(new Move());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null); // [[3]] 居中显示主窗口
frame.setVisible(true);
}
public static void main(String[] args) {
// [[4]] 由于 Swing 的线程问题,所以为了安全,放在下面的方法里创建主窗口
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}