java AWT Canvas不显示

问题遇到的现象和发生背景

我看了网上AWT的教程后 自己写了一下案例但是Canvas什么都不显示,后面我把作者写的试了一遍却可以,我对比了好久都没有有什么不一样。
代码1是我写的, 代码2是别人的。

问题相关代码,请勿粘贴截图

代码1:

package com.java.AWT;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class PinBall {
    private Frame frame = new Frame("title");
    //桌面的宽高
    private final int TABLE_WIDTH = 300;
    private final int TABLE_HIGHT = 400;
    //球拍的宽高
    private final int RACKET_WIDTH = 60;
    private final int RACKET_HIGHT = 20;
    //小球的大小 直径
    private final int BALL_SIZE = 16;

    //球拍的位置
    private int racketX = 120;
    private final int racketY = 340;
    //小球的位置
    private int ballX = 120;
    private int ballY = 20;

    //小球在X和Y轴上面的速度
    private int speedX = 10;
    private int speedY = 5;

    //游戏是否结束
    private boolean IsOver = false;

    //计时器
    private Timer timer;

    private class MyCanvas extends Canvas {
        @Override
        public void print(Graphics g) {
            System.out.println("print 被调用了");
            //TODO 在这里进行绘制
            if (IsOver) {       //游戏结束
                //绘制结束
                g.setColor(Color.BLUE);
                g.setFont(new Font("Times", Font.BOLD, 30));
                g.drawString("游戏结束!", 50, 190);
            } else {            //游戏中
                //绘制小球
                g.setColor(Color.RED);
                g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
                //绘制球拍
                g.setColor(Color.PINK);
                g.fillRect(racketX, racketY, RACKET_WIDTH, RACKET_HIGHT);
            }
        }
    }

    MyCanvas DrawArea = new MyCanvas();

    private void init() {        //组装界面
        KeyListener listener = new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int keycode = e.getKeyCode();

                System.out.println("keyListener");
                if (keycode == KeyEvent.VK_LEFT) {      //按下了左键
                    if (racketX > 0) {
                        racketX -= 10;
                    }
                }
                if (keycode == KeyEvent.VK_RIGHT) {     //按下了右键
                    if (racketX < (TABLE_WIDTH - RACKET_WIDTH)) {
                        racketX += 10;
                    }
                }
            }
        };

        frame.addKeyListener(listener);
        DrawArea.addKeyListener(listener);

        ActionListener task = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("task");
                //检测是否碰撞到边缘, 改变小球运动方向
                if (ballX <= 0 || ballX >= (TABLE_WIDTH - BALL_SIZE)) {
                    speedX = -speedX;
                }

                if (ballY <= 0 || (ballY > racketY - BALL_SIZE && ballX > racketX && ballX < racketX + RACKET_WIDTH)) {
                    speedY = -speedY;
                }

                if (ballY > racketY - BALL_SIZE && (ballX < racketX || ballX > racketX + RACKET_WIDTH)) {
                    //当前小球超出了球拍的范围,游戏结束
                    timer.stop();
                    IsOver = true;
                    DrawArea.repaint();
                }

                //改变小球的位置
                ballX = ballX + speedX;
                ballY = ballY + speedY;
                //重新绘制画面
                DrawArea.repaint();
            }
        };
        timer = new Timer(100,task);
        timer.start();

        DrawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HIGHT));
        frame.add(DrawArea);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new PinBall().init();
    }
}

代码2:

package com.java.AWT;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class PinBall {
    private Frame frame = new Frame("title");
    //桌面的宽高
    private final int TABLE_WIDTH = 300;
    private final int TABLE_HIGHT = 400;
    //球拍的宽高
    private final int RACKET_WIDTH = 60;
    private final int RACKET_HIGHT = 20;
    //小球的大小 直径
    private final int BALL_SIZE = 16;

    //球拍的位置
    private int racketX = 120;
    private final int racketY = 340;
    //小球的位置
    private int ballX = 120;
    private int ballY = 20;

    //小球在X和Y轴上面的速度
    private int speedX = 10;
    private int speedY = 5;

    //游戏是否结束
    private boolean IsOver = false;

    //计时器
    private Timer timer;

    private class MyCanvas extends Canvas {
        @Override
        public void print(Graphics g) {
            System.out.println("print 被调用了");
            //TODO 在这里进行绘制
            if (IsOver) {       //游戏结束
                //绘制结束
                g.setColor(Color.BLUE);
                g.setFont(new Font("Times", Font.BOLD, 30));
                g.drawString("游戏结束!", 50, 190);
            } else {            //游戏中
                //绘制小球
                g.setColor(Color.RED);
                g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
                //绘制球拍
                g.setColor(Color.PINK);
                g.fillRect(racketX, racketY, RACKET_WIDTH, RACKET_HIGHT);
            }
        }
    }

    MyCanvas DrawArea = new MyCanvas();

    private void init() {        //组装界面
        KeyListener listener = new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int keycode = e.getKeyCode();

                System.out.println("keyListener");
                if (keycode == KeyEvent.VK_LEFT) {      //按下了左键
                    if (racketX > 0) {
                        racketX -= 10;
                    }
                }
                if (keycode == KeyEvent.VK_RIGHT) {     //按下了右键
                    if (racketX < (TABLE_WIDTH - RACKET_WIDTH)) {
                        racketX += 10;
                    }
                }
            }
        };

        frame.addKeyListener(listener);
        DrawArea.addKeyListener(listener);

        ActionListener task = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("task");
                //检测是否碰撞到边缘, 改变小球运动方向
                if (ballX <= 0 || ballX >= (TABLE_WIDTH - BALL_SIZE)) {
                    speedX = -speedX;
                }

                if (ballY <= 0 || (ballY > racketY - BALL_SIZE && ballX > racketX && ballX < racketX + RACKET_WIDTH)) {
                    speedY = -speedY;
                }

                if (ballY > racketY - BALL_SIZE && (ballX < racketX || ballX > racketX + RACKET_WIDTH)) {
                    //当前小球超出了球拍的范围,游戏结束
                    timer.stop();
                    IsOver = true;
                    DrawArea.repaint();
                }

                //改变小球的位置
                ballX = ballX + speedX;
                ballY = ballY + speedY;
                //重新绘制画面
                DrawArea.repaint();
            }
        };
        timer = new Timer(100,task);
        timer.start();

        DrawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HIGHT));
        frame.add(DrawArea);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new PinBall().init();
    }
}
运行结果及报错内容

Canvas不显示

我的解答思路和尝试过的方法

我试了一下我重写的Canvas的print方法没有执行

我想要达到的结果

Canvas显示

问题解决了。是我单词写错了

你这代码2,也出不来结果啊