Visualizzazione di un’immagine in 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(); } } 

Non riesco a visualizzare l’immagine nel frame. Ho provato di tutto, ma ho l’impressione che sia un errore che non sto realizzando da quando sono nuovo in Java Swing. Qualsiasi aiuto sarebbe molto apprezzato.

Stai rendendo le cose difficili per te avendo una struttura del programma molto confusa e ti suggerisco di semplificare molto le cose.

Per uno, non è necessario per la tua attuale class MinesweeperMenu estendere MinesweeperPanel, e per quest’ultima class estendere JFrame. Quindi hai una JFrame statica da qualche altra parte – sono troppi JFrames, e per l’avvio, stai cercando di mostrare la tua immagine in una JFrame ma mostrando l’altra che non ha l’immagine. Il tuo programma ha bisogno di un solo JFrame e probabilmente dovrebbe essere creato, riempito con il suo contenuto, imballato e visualizzato in un unico posto, non sparsi qua e là come stai facendo.

Stai cercando di visualizzare l’immagine in una sostituzione di paintComponent, ma questo metodo non verrà mai chiamato poiché la tua class estende JFrame (eventualmente) e JFrame non ha questo metodo. Stai usando il metodo giusto, ma la class dovrebbe estendere JPanel e dovresti avere un’annotazione @Override sopra il blocco del metodo paintComponent per essere sicuro che stai sovrascrivendo un metodo genitore.

Dovresti sbarazzarti di tutto ciò che è statico in questo programma. L’unica cosa statica qui dovrebbe essere il metodo principale e forse alcune costanti, ma il gioco è fatto.

Ci sono più errori qui, e ho troppo poco tempo per esaminarli tutti. Prendi in considerazione l’idea di iniziare dall’inizio, iniziando in piccolo, facendo in modo che piccoli bit funzionino e quindi aggiungendoli insieme.

Ad esempio, prima crea un programma molto piccolo che tenta di leggere un’immagine in un object Immagine, posizionarlo in un ImageIcon, posizionare ImageIcon in una JLabel e visualizzare la JLabel in un JOptionPane, così semplice, solo per vedere se può leggere in immagini OK, ad esempio, qualcosa di simile a questo:

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

Quindi, quando hai fatto questo, vedi se ora puoi creare un JPanel che mostra la stessa immagine nel suo metodo paintComponent e mostra questo JPanel in un JOptionPane.

Quindi crea una JFrame e visualizza JPanel contenente le immagini nella JFrame.

Attraverso iterazioni successive testerai i concetti, correggerai gli errori e costruirai il tuo programma.

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

Se MineMenuPicture.jpg è una risorsa applicativa, dovrebbe trovarsi in un Jar e accedere all’URL ottenuto da Class.getResource(String) .