Есть несколько проблем с кодом.
В дополнение к другим предложениям использования pack () или установки размера фрейма «после» добавления компонентов в фрейм и непосредственно перед вызовом метода setVisible (true), вам нужно взглянуть на следующее.
Код основан на старых методах рисования AWT, которые НЕ должны использоваться с Swing. Вы НИКОГДА не должны переопределять методы update () или paint () JFrame. Причина, по которой дочерние компоненты не окрашены, заключается в том, что метод paint () отвечает за их отображение, но вы переопределяете это поведение по умолчанию.
Когда пользовательское рисование Swing выполняется путем переопределения метода paintComponent () JComponent или JPanel, этот компонент добавляется на панель содержимого фрейма. Прочитайте раздел из учебника Swing по Custom Painting для получения дополнительной информации и рабочих примеров. Одним из ключевых моментов в учебнике является предоставление предпочтительного размера для компонента, чтобы он мог быть правильно размечен менеджером макета.
Вы НЕ должны использовать KeyListener. Опять же, это старая техника AWT. Swing теперь использует привязки клавиш для сопоставления KeyStrokes с действием. Для получения дополнительной информации прочитайте раздел из руководства Swing «Как использовать привязки клавиш».
Вы НЕ должны использовать WindowListener для повторного закрытия кадра, это старая техника AWT. Приложения Swing теперь используют метод frame.setDefaultCloseOperation (...) для управления этим.
В разделе «Как использовать значки» вы найдете более простые способы загрузки изображения.
Итак, в общем, я предложил вам начать с загрузки учебного пособия по Swing, чтобы изучить приемы программирования на Swing. Учебное пособие охватывает основы и множество простых примеров, с которых можно начать.