首页 > 解决方案 > 如何使用 ImageIcon 将图像添加到我的 GUI?

问题描述

我对如何在 java 中将图像添加到我的 GUI 感到非常困惑。下面是我的代码,我ImageIcon用来实现图像“map.png”,但是当我运行这个程序时,图像没有出现。这是因为它与我的 .java 文件不在同一个文件夹中,还是有其他问题?

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GUI implements ActionListener 
{
    private int count = 0;
    private JLabel label;
    private JFrame frame;
    private JPanel panel;
    
    public GUI()
    {
        frame = new JFrame();
        frame.setResizable(false);
        
        ImageIcon icon = new ImageIcon("map.png");
        JLabel picture = new JLabel(icon);
        
        JButton button = new JButton("Click me");
        button.addActionListener(this);
        
        label = new JLabel("Number of clicks: 0");
        
        panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(400, 700, 10, 30));
        panel.setLayout(new GridLayout(0, 1));
        panel.add(button);
        panel.add(label);
        frame.add(picture);
        
        frame.add(panel, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Maynooth Thing");
        frame.pack();
        frame.setVisible(true);
    }
    
    public static void main(String[] args) 
    {
        new GUI();
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        count++;
        label.setText("Number of clicks: " + count);
    }
}

标签: javaimageswingembedded-resourceimageicon

解决方案


Java 会在实际工作目录,即java 启动的目录中搜索镜像。这取决于它是如何启动的——如果是命令行,它与命令行使用的相同;IDE 通常有一些设置(例如,eclipse 的默认设置是项目主目录)。打印它的简单方法System.out.println(new java.io.File("").getAbsolutePath());

不幸 new ImageIcon的是,如果找不到文件,则不会抛出异常 - 如果找不到,图标大小(getIconHeight()getIconWidth())将设置为-1ImageIO考虑到图像不是应用程序的一部分,更适合从文件中读取图像;否则,图像是应用程序的一部分,getResource()应使用类或类加载器。

文件的位置.java在执行期间根本不相关。如果使用类加载器中的方法,文件的位置.class(类路径)将很重要getResource(推荐!特别是如果应该从 JAR 中读取图像/文件)。


推荐阅读