前回画像表示したから今回はそれをキーボードで動かす。Component#setFocusableでtrue設定しておかないと、フォーカスがこないのでキーボードに反応してくれないので設定。あとはキーボードイベントだけ追加。今はコンポーネントがキャラクターの画像と座標を管理してるので、キャラクター用のクラスをそのうち作る。
import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import java.awt.Color; import java.awt.Graphics; import java.awt.Dimension; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.io.File; import java.io.IOException; public class Glenda extends JComponent implements KeyListener{ private static final int MOVE_DISTANCE = 4; private BufferedImage glendaImage; private int gx; private int gy; public static void main(String[] args){ SwingUtilities.invokeLater(new Runnable(){ public void run(){ Glenda.start(); } }); } private static void start(){ try{ JFrame frame = new JFrame("Glenda"); Glenda glenda = new Glenda(); glenda.loadGlendaImage("./glenda_32.png"); glenda.setPreferredSize(new Dimension(600, 500)); frame.add(glenda); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }catch(IOException e){ String message = "Glendaを読み込めませんでした"; String title = "エラー"; JLabel label = new JLabel(message); label.setForeground(Color.RED); JOptionPane.showMessageDialog(null, label, title, JOptionPane.ERROR_MESSAGE); } } public Glenda(){ gx = 0; gy = 0; setFocusable(true); addKeyListener(this); } public void loadGlendaImage(String fileName) throws IOException{ glendaImage = ImageIO.read(new File(fileName)); } @Override protected void paintComponent(Graphics g){ g.setColor(Color.WHITE); g.fillRect(0, 0, getWidth(), getHeight()); g.drawImage(glendaImage, gx, gy, null); } public void glendaMove(int dx, int dy){ gx += dx; gy += dy; repaint(); } public void keyPressed(KeyEvent e){ switch(e.getKeyCode()){ case KeyEvent.VK_UP: glendaMove(0, -Glenda.MOVE_DISTANCE); break; case KeyEvent.VK_DOWN: glendaMove(0, Glenda.MOVE_DISTANCE); break; case KeyEvent.VK_RIGHT: glendaMove(Glenda.MOVE_DISTANCE, 0); break; case KeyEvent.VK_LEFT: glendaMove(-Glenda.MOVE_DISTANCE, 0); break; default: break; } } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} }