Не относится к вашему вопросу, но на основании кода, который вы разместили, похоже, что вы скопировали старый код AWT и пытаетесь использовать его в приложении Swing.
Я бы предложил вам использовать только Swingкомпоненты.Нет необходимости использовать Canvas с BufferStrategy.Просто используйте JPanel, по умолчанию это двойная буферизация.Скопированный фрагмент кода устарел, и это не так, как в Swing.
Не используйте пустой макет.Swing был разработан для использования с менеджерами верстки.Тогда метод pack () сможет правильно выполнять свою работу.
Нет необходимости использовать WindowListener для закрытия фрейма.В эти дни люди просто используют:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Кроме того, рамку следует сделать видимой ПОСЛЕ добавления компонентов к рамке.
Обычно вам следует использовать привязки клавиш, а не KeyListener дляпрослушайте ключевые события в приложении Swing.
Я предлагаю вам взглянуть на учебник Swing для получения дополнительной информации о вышеупомянутых концепциях.