我很难理解为什么一个类中的动作是抽象的而另一个类中的动作却不是抽象的。
源代码1:(编译时出错:https : //gyazo.com/cd3c21a8562589451814903febaf89fe)
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Play extends JFrame{ Engine drawPanel = new Engine(); private int x = 0; private int y = 0; public int getX(){ return x; } public int getY(){ return y; } public Play(){ Action rightAction = new AbstractAction(){ public void actionPreformed(ActionEvent e){ x+=10; drawPanel.repaint(); } }; Action leftAction = new AbstractAction(){ public void actionPreformed(ActionEvent e){ x-=10; drawPanel.repaint(); } }; InputMap inputMap = drawPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW); ActionMap actionMap = drawPanel.getActionMap(); inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "rightAction"); actionMap.put("rightAction", rightAction); inputMap.put(KeyStroke.getKeyStroke("LEFT"), "leftAction"); actionMap.put("leftAction", leftAction); add(drawPanel); pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(640, 480); setTitle("Game"); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args){ EventQueue.invokeLater(new Runnable(){ @Override public void run(){ new Play(); } }); } }
源代码2 :(编译好的代码)
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class KeyBidings extends JFrame { int x = 0; int y = 0; DrawPanel drawPanel = new DrawPanel(); public KeyBidings(){ Action rightAction = new AbstractAction(){ public void actionPerformed(ActionEvent e) { x +=10; drawPanel.repaint(); } }; InputMap inputMap = drawPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW); ActionMap actionMap = drawPanel.getActionMap(); inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "rightAction"); actionMap.put("rightAction", rightAction); add(drawPanel); pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); setVisible(true); } private class DrawPanel extends JPanel { protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.GRAY); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.GREEN); g.fillRect(x, y, 50, 50); } public Dimension getPreferredSize() { return new Dimension(400, 200); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ public void run(){ new KeyBidings(); } }); } }
因为在第一个示例中您输入错误:
actionPreformed
应该是
actionPerformed