Ответ 1
Вы затрудняете себя, создавая сложную структуру очень, и я предлагаю вам упростить многое.
Во-первых, вам не нужно, чтобы ваш текущий класс MinesweeperMenu расширил MinesweeperPanel, а для последнего класса - расширение JFrame. Тогда у вас есть статический JFrame где-то в другом месте - слишком много JFrames, и для загрузки вы пытаетесь отобразить свое изображение в одном JFrame, но показываете другое, у которого нет изображения. Ваша программа нуждается только в одном JFrame, и ее следует, вероятно, создать, заполнить ее содержимым, упаковать и отобразить в одном месте, а не разбросать здесь и там, как вы делаете.
Вы пытаетесь отобразить изображение в переопределении paintComponent, но этот метод никогда не будет вызван, так как ваш класс расширяет JFrame (в конечном итоге), а JFrame не имеет этого метода. Вы используете правильный метод, но класс должен расширять JPanel, и вы должны иметь аннотацию @Override
над блоком метода paintComponent, чтобы убедиться, что вы фактически переопределяете родительский метод.
Вы должны избавиться от статического содержимого all все в этой программе. Единственное, что статично здесь, должно быть главным методом и, возможно, некоторыми константами, но это.
Здесь больше ошибок, и у меня слишком мало времени, чтобы обойти их все. Подумайте, начиная с самого начала, начиная с малого, получая небольшие биты для работы, а затем добавляя их вместе.
Например, сначала создайте очень маленькую программу, которая пытается прочитать изображение в объект изображения, поместите его в ImageIcon, поместите ImageIcon в JLabel и покажите JLabel в JOptionPane, что просто, просто посмотрите, можете ли вы читать в изображениях ОК, например, что-то вроде этого:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class TestImages {
// *** your image path will be different *****
private static final String IMG_PATH = "src/images/image01.jpg";
public static void main(String[] args) {
try {
BufferedImage img = ImageIO.read(new File(IMG_PATH));
ImageIcon icon = new ImageIcon(img);
JLabel label = new JLabel(icon);
JOptionPane.showMessageDialog(null, label);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Затем, когда вы это сделали, посмотрите, можете ли вы теперь создать JPanel, который показывает одно и то же изображение в своем методе paintComponent, и отобразить этот JPanel в JOptionPane.
Затем создайте JFrame и отобразите JPanel, удерживающий изображение, в JFrame.
Через последовательные итерации вы будете тестировать концепции, исправлять ошибки и создавать свою программу.