【问题标题】:How can I display an image in a JPanel如何在 JPanel 中显示图像
【发布时间】:2016-07-23 14:06:34
【问题描述】:

我的问题是如何将图像显示到 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) 是我显示图像所需的工作,来自JPanel jp 中的网址String url

【问题讨论】:

  • 发布一个完整的最小示例来重现问题。
  • 尝试使用ImageIO.read(new File("GUI/img/gray.png")),如果由于某种原因无法加载图像,则会抛出异常,而ImageIcon不会。更多详情请见Reading/Loading an Image
  • @JBNizet 在涉及图像的示例中,我想添加以下建议 - 例如,获取图像的一种方法是热链接到 this Q&A 中看到的图像。
  • 看起来像添加组件问题(没有触发重新布局)。将标签添加到面板后,尝试重新验证并重新绘制面板(panel.revalidate();panel.repaint();)。
  • @SergiyMedvynskyy 尝试了两种方法 panel.revalidate()panel.repaint() 均无效。面板仍然不显示图像。

标签: java image swing jpanel


【解决方案1】:

在谷歌中寻找代码片段我最终找到了一个解决方案......并且正在应用以前的 cmets 引用的相同模式。 给我解决方案的代码是:

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

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

感谢大家的回答和建议!

【讨论】:

    【解决方案2】:

    我在创建 Minesweeper 时遇到了类似的问题。我最终找到了一个解决方案并通过首先加载一个图像然后从该图像创建一个 ImageIcon 来使其工作。

    Image myImage = ImageIO.read(getClass().getResource("image_path.jpg"));
        myImage = myImage.getScaledInstance(30, 30, java.awt.Image.SCALE_SMOOTH);
        ImageIcon myImageIcon = new ImageIcon(myImage);
    

    【讨论】:

    • 应用程序资源在部署时将成为嵌入式资源,因此明智的做法是立即开始访问它们。 embedded-resource 必须通过 URL 而不是文件访问。请参阅info. page for embedded resource 了解如何形成 URL。上面(如本答案所示)是通过 URL 加载图像的示例。 (所以..这部分工作很好@22ninjas)。
    • @22ninjas 我尝试了该代码但没有任何效果。我从ImageIO 创建了一个Image 对象,然后将其传递给ImageIcon,后者传递给JLabel,并将JLabel 添加到JPanel,什么也没有,图像不会显示在面板中.也许我在这个过程中犯了一个错误,但是以这种方式实施对我来说不起作用。
    【解决方案3】:

    你必须使用 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));
        }
    }
    

    【讨论】:

    • 让我看看我是否理解这一点,ExImage 是我需要使用该代码创建的 java 类,并从具有主界面的主 JFrame 调用 @987654324 @构造函数表示来自JPanel内的url中的图像,包含在JFrame内?
    猜你喜欢
    • 2017-08-02
    • 2017-01-10
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2010-11-17
    相关资源
    最近更新 更多