使用JFileChooser将图像加载到JFrame中 [英] image loading using a JFileChooser into a JFrame

查看:112
本文介绍了使用JFileChooser将图像加载到JFrame中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个代码,将使用JFileChooser选择的图像显示到另一个JFrame中。我尝试了下面的代码,但只得到以下错误。

I am trying to write a code that displays an image selected using a JFileChooser into another JFrame .I tried the following code below but only got the following errors.

Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(ImageIcon.java:228)
at power.<init>(fCGUI.java:53)
at fCGUI.main(fCGUI.java:11)

以下是代码:

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class fCGUI
{
    public static void main(String []args)
    {
        power p=new power();
        p.setVisible(true);
    }
}

class power extends JFrame
{
    JFileChooser chooser;
    BufferedImage img;
    JButton button,button2;
    JFrame comp;
    String filename;
    File file ; 

    public power()
    {
        setSize(450,450);
        panel.setLayout(new BorderLayout());

        JPanel panel=new JPanel();
        getContentPane().add(panel);
        button =new JButton("press");

        panel.add(button,BorderLayout.NORTH);

        chooser = new JFileChooser();

        ActionListener action=new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if (e.getSource()==button)
                {
                    chooser.showOpenDialog(null);
                    file = chooser.getSelectedFile();

                    try
                    {
                        img=ImageIO.read(file);
                    }
                    catch(IOException e1) {}
                }

                if (e.getSource()==button2)
                {
                    comp.setVisible(true);
                }
            }
        };

        ImageIcon icon=new ImageIcon(img);
        JLabel label=new JLabel(icon);

        JPanel secpanel=new JPanel();

        comp=new JFrame();
        comp.setSize(650,500);
        comp.setLayout(new BorderLayout());
        comp.setTitle("View Report");

        JRootPane compPane=comp.getRootPane();
        Container contePane=compPane.getContentPane();
        contePane.add(secpanel);

        secpanel.add(label,BorderLayout.CENTER);

        button2=new JButton("access");
        button2.addActionListener(action);
        button.addActionListener(action);

        panel.add(button2,BorderLayout.SOUTH);
    }
}


推荐答案

在用户单击按钮并选择要显示的文件后, img 的值将只有实际值。在此之前, img 的值为 null ,因此当它继续通过您的方法并调用行<$时c $ c> ImageIcon icon = new ImageIcon(img); ,它正在尝试为 null创建 ImageIcon 对象

The value of img will only have a real value after the user click the button and chooses the file to display. Until this time, the value of img is null, so when it continues through your method and calls the line ImageIcon icon=new ImageIcon(img);, it is trying to create an ImageIcon object for null.

要更正此问题,您应该只在用户创建 ImageIcon 时选择了该文件。这是一个应该更接近正常工作的变化。 (请参阅以下代码中的注释 // ADDED // REMOVED 以查看更改...

To correct this, you should only be creating the ImageIcon when the user has chosen the file. Here is a change that should be closer to working correctly. (see the comments //ADDED and //REMOVED in the code below to see the changes...

...
class power extends JFrame {
    JFileChooser chooser;
    BufferedImage img;
    JButton button,button2;
    JFrame comp;
    String filename;
    File file ; 
    JLabel label; // ADDED

    public power() {
    ...
            public void actionPerformed(ActionEvent e) {
                if (e.getSource()==button) {
                    chooser.showOpenDialog(null);
                    file = chooser.getSelectedFile();

                    try {
                        img=ImageIO.read(file);
                        ImageIcon icon=new ImageIcon(img); // ADDED
                        label.setIcon(icon); // ADDED

                        Dimension imageSize = new Dimension(icon.getIconWidth(),icon.getIconHeight()); // ADDED
                        label.setPreferredSize(imageSize); // ADDED

                        label.revalidate(); // ADDED
                        label.repaint(); // ADDED
                    }
                    catch(IOException e1) {}
                }

                if (e.getSource()==button2){
                    comp.setVisible(true);
                }
            }
        };

        //ImageIcon icon=new ImageIcon(img); // REMOVED
        //JLabel label=new JLabel(icon); // REMOVED
        label = new JLabel(); // ADDED

        JPanel secpanel=new JPanel();
        ...

解释我的变化......

To explain what I've changed...


  1. 标签现在将创建为空 JLabel 第一次启动程序时。它也存储为全局变量,以便我们以后访问它。

  2. 单击该按钮时,将创建 img ,如之前,然后使用 setIcon();

  3. <将它加载到标签中li>调整标签大小,然后 revalidate() repaint()以确保在之后绘制图像它被设定。
  1. The label will now be created as an empty JLabel when you first start the program. It is also stored as a global variable so we can access it later
  2. When the button is clicked, the img is created, as before, and then it is loaded into your label using setIcon();
  3. The label is resized, then revalidate() and repaint() to make sure that the image is drawn after it is set.

这篇关于使用JFileChooser将图像加载到JFrame中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆