Mostrar una imagen en Java Swing

public class MinesweeperMenu extends MinesweeperPanel{ private JPanel picture = new JPanel(); private JButton play = new JButton("Play"); private JButton highScores = new JButton("High Score and \nStatistics"); private JButton changeMap = new JButton("Create Custom \nor Change Map"); private JButton difficulty = new JButton("Custom or\nChange Difficulty"); private JButton user = new JButton("Change User"); Image img; public MinesweeperMenu() { // Set Layout for the menu LayoutManager menuLayout = new BoxLayout(menu, BoxLayout.Y_AXIS); menu.setLayout(menuLayout); // Set Layout for the window LayoutManager windowLayout = new BorderLayout(); window.setLayout(windowLayout); // Add buttons to the panels menu.add(play); menu.add(highScores); menu.add(changeMap); menu.add(difficulty); menu.add(user); // Add picture to the frame try{ File input = new File("./setup/images/MineMenuPicture.jpg"); img = ImageIO.read(input); } catch(IOException ie) { System.out.println(ie.getMessage()); } // Add action listeners changeMap.addActionListener(new ChangeMapListener()); } public void paintComponent(Graphics g) { // POSITION OF THE PICTURE int x = 650; int y = 585; g.drawImage(img, x, y, null); } public void displayFrame() { // Display Frame window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setVisible(true); } public static void main(String[] args) { MinesweeperMenu menu = new MinesweeperMenu(); window.pack(); menu.displayFrame(); window.repaint(); } } public class MinesweeperPanel extends JFrame{ public static final Color COLOR_KEY = new Color(220, 110, 0); // Initialize all the objects public static JFrame window = new JFrame("Minesweeper++"); public static JPanel menu = new JPanel(); // Close the current window public static void close() { window.setVisible(false); window.dispose(); } } 

No puedo hacer que mi imagen se muestre en el marco. He intentado todo, pero me da la impresión de que es un error que no me estoy dando cuenta, ya que soy nuevo en Java Swing. Cualquier ayuda sería muy apreciada.

Estás haciendo las cosas difíciles para ti al tener una estructura de progtwig muy confusa, y te sugiero que simplifiques las cosas mucho .

Por un lado, no hay necesidad de que su clase MinesweeperMenu actual amplíe MinesweeperPanel, y para que la última clase amplíe JFrame. Luego tiene un JFrame estático en otro lugar, son demasiados JFrames, y para empezar, está tratando de mostrar su imagen en un JFrame pero mostrando el otro que no tiene la imagen. Su progtwig necesita solo un JFrame y probablemente debería ser creado, rellenado con su contenido, empaquetado y exhibido en un solo lugar, no disperso aquí y allá mientras lo hace.

Está intentando mostrar la imagen en una anulación de paintComponent, pero nunca se llamará a este método ya que su clase extiende JFrame (eventualmente) y JFrame no tiene este método. Estás utilizando el método correcto, pero la clase debería extender JPanel, y debes tener una anotación @Override sobre el bloque de método paintComponent para asegurarte de que estás reemplazando a un método principal.

Debería deshacerse de todo lo estático en este progtwig. Lo único estático aquí debería ser el método principal y quizás algunas constantes, pero eso es todo.

Aquí hay más errores y tengo muy poco tiempo para revisarlos todos. Considere empezar desde el principio, comenzar de a poco, hacer que funcionen pequeños bits y luego sumrlos.

Por ejemplo, primero cree un progtwig muy pequeño que intente leer en una imagen en un objeto de imagen, colóquelo en un ImageIcon, coloque el ImageIcon en un JLabel y muestre el JLabel en un JOptionPane, así de simple, solo para ver si puede leer en imágenes OK, por ejemplo, algo como esto:

 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(); } } } 

Luego, cuando haya hecho esto, vea si ahora puede crear un JPanel que muestre la misma Imagen en su método paintComponent y muestre este JPanel en JOptionPane.

Luego, cree un JFrame y muestre el JPanel que contiene la imagen en el JFrame.

A través de sucesivas iteraciones, probarás conceptos, corregirás errores y construirás tu progtwig.

 File input = new File("./setup/images/MineMenuPicture.jpg"); 

Si MineMenuPicture.jpg es un recurso de la aplicación, debe estar en un Frasco y se accede por URL obtenida de Class.getResource(String) .