Отображение изображения в Java Swing - PullRequest
12 голосов
/ 01 декабря 2011
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();
}



}

Я не могу отобразить свое изображение в кадре. Я перепробовал все, но у меня сложилось впечатление, что это ошибка, которую я не осознаю, так как я новичок в Java Swing. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

34 голосов
/ 01 декабря 2011

Вы делаете вещи сложными для себя, имея очень запутанную структуру программы, и я предлагаю вам упростить вещи лот .

С одной стороны, ваш текущий класс MinesweeperMenu не нуждается в расширении MinesweeperPanel, а последний - в расширении JFrame.Тогда у вас есть статический JFrame где-то еще - это слишком много JFrame, и для загрузки вы пытаетесь отобразить ваше изображение в одном JFrame, но показывает другой, у которого нет изображения.Ваша программа нуждается только в одном JFrame, и, вероятно, ее следует создать, заполнить ее содержимым, упаковать и отобразить в одном месте, а не разбрасывать здесь и там, как вы делаете.

Вы пытаетесь отобразить картинкув переопределении paintComponent, но этот метод никогда не будет вызван, так как ваш класс расширяет JFrame (в конце концов), а JFrame не имеет этого метода.Вы используете правильный метод, но класс должен расширять JPanel, и у вас должна быть аннотация @Override над блоком метода paintComponent, чтобы быть уверенным, что вы на самом деле переопределяете родительский метод.

Выследует избавиться от все статического все в этой программе.Единственным статичным здесь должен быть метод main и, возможно, некоторые константы, но это все.

Здесь больше ошибок, и у меня слишком мало времени, чтобы просмотреть все из них.Попробуйте начать с самого начала, начать с малого, заставить маленькие биты работать, а затем сложить их вместе.

Например, сначала создайте очень маленькую программу, которая пытается прочитать изображение в объекте Image, поместите егов 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.

Через последовательные итерации вы будете тестировать концепции, исправлять ошибки и строить свою программу.

6 голосов
/ 01 декабря 2011
File input = new File("./setup/images/MineMenuPicture.jpg");

Если MineMenuPicture.jpg является ресурсом приложения, он должен быть в Jar-файле и доступен по URL-адресу, полученному из Class.getResource(String).

...