Отображение изображения в 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 ornChange 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 ответов
Вы делаете вещи трудными для себя, имея очень запутанная структура программы, и я предлагаю вам упростить вещи a много.
во-первых, нет необходимости для вашего текущего класса MinesweeperMenu расширять MinesweeperPanel, а для последнего класса расширять JFrame. Тогда у вас есть статический JFrame где-то еще-это слишком много JFrames, и для загрузки вы пытаетесь отобразить свое изображение в одном JFrame, но показываете другой, у которого нет фотографии. Ваша программа нуждается только в одном JFrame, и она, вероятно, должна быть создана, заполнена ее содержимым, упакована и отображена в одном месте, а не разбросана здесь и там, как вы делаете.
вы пытаетесь отобразить изображение в переопределении paintComponent, но этот метод никогда не будет вызван, так как ваш класс расширяет JFrame (в конечном итоге), а JFrame не имеет этого метода. Вы используете правильный метод, но класс должен расширять JPanel, и вы должны иметь @Override
аннотация над блоком метода paintComponent, чтобы убедиться, что вы фактически переопределяете родительский метод.
вы должны избавиться от все static все в этой программе. Единственное, что здесь статично, - это основной метод и, возможно, некоторые константы, но это все.
здесь больше ошибок, и у меня слишком мало времени, чтобы просмотреть их все. Рассмотрим, начиная с самого начала, начиная с малого, получение маленьких кусочков для работы, а затем сложение их вместе.
например, сначала создайте очень маленькую программу, которая пытается прочитать изображение в объект изображения, поместите его в ImageIcon, поместите ImageIcon в JLabel и отобразите JLabel в JOptionPane, это просто, чтобы увидеть, можете ли вы читать в изображениях OK, например, что-то вроде этого:
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.
через последовательные итерации вы будете тестировать концепции, исправлять ошибки и строить свою программу.
File input = new File("./setup/images/MineMenuPicture.jpg");
Если MineMenuPicture.jpg
является ресурсом приложения, он должен быть в банке и доступен по URL, полученному из Class.getResource(String)
.