web-dev-qa-db-fra.com

Affichage d'une image 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();
}



}

Je n'arrive pas à afficher mon image dans le cadre. J'ai tout essayé, mais j'ai l'impression que c'est une erreur que je ne réalise pas car je suis nouveau à Java Swing. Toute aide serait grandement appréciée.

12
Dominick Piganell

Vous rendez les choses difficiles pour vous en ayant une structure de programme très confuse, et je vous suggère de simplifier les choses a lot .

D'une part, il n'est pas nécessaire que votre classe MinesweeperMenu actuelle étende MinesweeperPanel et que cette dernière classe étende JFrame. Ensuite, vous avez un JFrame statique ailleurs - c'est trop de JFrames, et pour démarrer, vous essayez d'afficher votre image dans un JFrame mais en montrant l'autre qui n'a pas l'image. Votre programme n'a besoin que d'un seul JFrame et il devrait probablement être créé, bourré de son contenu, emballé et affiché en un seul endroit, pas dispersé ici et là comme vous le faites.

Vous essayez d'afficher l'image dans un remplacement paintComponent, mais cette méthode ne sera jamais appelée car votre classe étend JFrame (éventuellement) et JFrame n'a pas cette méthode. Vous utilisez la bonne méthode, mais la classe devrait étendre JPanel et vous devriez avoir un @Override annotation au-dessus du bloc de méthode paintComponent pour être sûr que vous êtes en train de remplacer une méthode parent.

Vous devez vous débarrasser de tout tout ce qui est statique dans ce programme. La seule chose statique ici devrait être la méthode principale et peut-être quelques constantes, mais c'est tout.

Il y a plus d'erreurs ici, et j'ai trop peu de temps pour les parcourir toutes. Pensez à commencer par le début, à commencer petit, à faire fonctionner de petits morceaux, puis à les ajouter ensemble.

Par exemple, créez d'abord un très petit programme qui essaie de lire une image dans un objet Image, placez-la dans un ImageIcon, placez l'ImageIcon dans un JLabel et affichez le JLabel dans un JOptionPane, aussi simple que cela, juste pour voir si vous peut lire des images OK, par exemple, quelque chose comme ceci:

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

Ensuite, lorsque vous avez fait cela, voyez si vous pouvez maintenant créer un JPanel qui montre la même image dans sa méthode paintComponent, et afficher ce JPanel dans un JOptionPane.

Créez ensuite un JFrame et affichez le JPanel contenant l'image dans le JFrame.

Au cours d'itérations successives, vous testerez des concepts, corrigerez des erreurs et construirez votre programme.

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

Si MineMenuPicture.jpg Est une ressource d'application, elle doit être dans un Jar et accessible par l'URL obtenue à partir de Class.getResource(String).

6
Andrew Thompson