Проблема в том, что в верхней части аквариума отображается только одно изображение вместо рыбы (либо аквариум, либо рыба, в зависимости от того, какое из них было добавлено в JFrame первым).
По умолчанию JPanel
использует FlowLayout
, который учитывает предпочтительный размер любого добавленного к нему компонента.
По умолчанию JFrame
использует BorderLayout
, и если вы не задаете ограничение,Компонент добавляется к CENTER
из BorderLayout
, что означает, что размер компонента автоматически изменяется, чтобы заполнить пространство кадра.
Таким образом, компонент, который вы добавляете в кадр, будет иметь размер, чтобы заполнить кадр,Компонент, добавляемый на панель, будет иметь размер (0, 0), поэтому рисовать нечего.
Итак, некоторые пользовательские советы по рисованию:
ПереопределитьgetPreferredSize()
метод панели, возвращающий размер изображения, чтобы менеджер макетов мог выполнять свою работу
Вызовите super.paintComponent (..) в качестве первого оператора, чтобы убедиться, чтофон очищается.
Не читать изображение в методе paintComponent ().Этот метод можно вызывать всякий раз, когда Swing определяет, что компонент должен быть перекрашен, поэтому неэффективно продолжать чтение изображения.Вместо этого изображение следует прочитать в конструкторе класса.
Не вызывайте repaint () в методе рисования.Это приведет к бесконечному циклу рисования.
Кроме того, компоненты должны быть добавлены в рамку, ДО того, как вы сделаете рамку видимой.
Сказав все вышесказанное, Алеррапредложение в комментарии нарисовать оба изображения на одной панели - хорошая идея.Это упрощает рисование, и вы даже можете легко рисовать несколько рыб, сохраняя ArrayList изображений, которые вы хотите нарисовать.Затем вы просто рисуете фон, а затем перебираете ArrayList, чтобы нарисовать отдельную рыбу.
Проверьте Пользовательские подходы к рисованию для рабочего примера.Пример рисует только прямоугольник, но концепция та же.