为什么这个动作不是抽象的?

Why isn't this action abstract?

我很难理解为什么 class 中的一个动作是抽象的而另一个 class 中的动作不是。

源代码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