如何在 JPanel 中显示图像

新手上路,请多包涵

我的问题是如何将图像显示到 JPanel 中?我不清楚这里询问类似问题的其他主题我该怎么做。

我的项目文件夹中有一个目录,其中包含图像文件 Project Folder/GUI/img ,特别是 gray.pnggreen.png 我想在 JPanel 中显示。

我尝试使用以下代码使用 ImageIconJLabel 我在其他帖子中找到的代码:

 ImageIcon image = new ImageIcon("GUI/img/gray.png");
JLabel label = new JLabel(image);

//JPanel panel is already initialized by the IDE
panel.add(label)

但是不起作用… JPanel 保持空白而不显示任何图像。我怎样才能做到这一点?

除此之外,我希望 JPanel 中的图像发生变化( gray.pnggreen.png ),例如按下某个按钮时。我可以通过相同的方法将其存档以在 JPanel 中显示图像,对吗?

提前致谢!

编辑:这是获取此测试代码的示例。初始化由 IDE 自动完成。

 import java.awt.Image;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class Sample extends javax.swing.JFrame {

    public Sample() {
        initComponents();
    }

    //Initialization
    private void initComponents() {

        PanelImage = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        javax.swing.GroupLayout PanelImageLayout = new javax.swing.GroupLayout(PanelImage);
        PanelImage.setLayout(PanelImageLayout);
        PanelImageLayout.setHorizontalGroup(
            PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
        PanelImageLayout.setVerticalGroup(
            PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(61, 61, 61)
                .addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(239, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(45, 45, 45)
                .addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(155, Short.MAX_VALUE))
        );

        pack();
    }

    private void formWindowOpened(java.awt.event.WindowEvent evt) {
        try {
            DisplayImage(PanelImage, "/GUI/img/gray.png");
        } catch (Exception ex) {
            Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //For display the url image in a JPanel
    private void DisplayImage(JPanel jp, String url) throws IOException, Exception {
        try {
            Image image=ImageIO.read(this.getClass().getResource(url));
            ImageIcon imageicon=new ImageIcon(image);
            JLabel label=new JLabel(imageicon);
            jp.add(label);
        } catch (IOException ex) {
            throw new IOException();
        } catch (Exception ex) {
            throw new Exception();
        }
    }

    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Sample.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Sample().setVisible(true);
            }
        });
    }

    // Variables declaration
    private javax.swing.JPanel PanelImage;
}

private void DisplayImage(JPanel jp, String url) 是我需要显示图像的工作,来自 url String urlJPanel jp

原文由 FiroKun 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 607
2 个回答

在谷歌中寻找代码片段,我最终得到了一个解决方案……并且应用了与之前评论所引用的相同模式。给我解决方案的代码是:

label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/gray.png")))

这样,我就制作了我想要实现的方法:

 private static void DisplayImage(JPanel jp, String url) {
    JLabel jl=new JLabel();
    jl.setIcon(new javax.swing.ImageIcon(getClass().getResource(url)));
    jp.add(jl);
}

也许这不是完美和最正确的解决方案,但对我来说是完美的,这就是我想要的。

感谢大家的回答和建议!

原文由 FiroKun 发布,翻译遵循 CC BY-SA 3.0 许可协议

你必须使用 ImageIcon(this.getClass().getResource(“/Gui/img/gray.png”));

这是它工作的例子。

 import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ExImage extends JPanel
{

    public ExImage()
    {
    ImageIcon imageIcon = new ImageIcon(this.getClass().getResource("/gray.png"));
    JLabel label = new JLabel(imageIcon);
    add(label);
    }

    public static void main(String[] args)
    {
    JFrame frame = new JFrame();
    frame.add(new ExImage());
    frame.setVisible(true);
    frame.setPreferredSize(new Dimension(200, 300));
    }
}

原文由 shimbu shambu 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题