使用JLabel显示选择的图像文件的问题

时间:2012-07-06 12:23:57

标签: java swing jlabel imageicon

我在单击按钮并在“选择文件对话框”中选择图像文件后尝试显示图像时遇到了问题。

最初,我设法在JLabel中显示所选图像,但后来我创建了一个单独的ActionListener,我认为从那时起它就开始出错了。无论我选择什么图像,JLabel都不会显示它。

我对其进行了调试,并确保文件选择器确实将图像传递给ImageIconJLabel确实从ImageIcon获取了值,但即使之后它也不会显示图像revalidate()repaint()

在这里,我附上了我的代码供您参考!

(我修剪了代码以获得干净的外观,因此可能会留下一些无用的括号)

package com.xxx.LoyalCardManager;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.filechooser.FileFilter;

public class LoyalCardManagerMain implements ActionListener{

private JFrame frame;
private DatabaseHandler db = new DatabaseHandler();


private JLabel labelPic;

private JButton buttonPic;

private File picFile = new File("");
private BufferedImage image;


/**
 * Launch the application.
 * @throws SQLException 
 * @throws ClassNotFoundException 
 */
public static void main(String[] args) throws SQLException, ClassNotFoundException {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                LoyalCardManagerMain window = new LoyalCardManagerMain();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });


}



}

/**
 * Create the application.
 */
public LoyalCardManagerMain() {

    // Database initialisation
    initDatabase();

    // Draw GUI
    frame = new JFrame();
    frame.setBounds(100, 100, 619, 487);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    buttonPic = new JButton("Click to Choose Pic");
    buttonPic.setBounds(415, 252, 166, 29);
    frame.getContentPane().add(buttonPic);
    buttonPic.setEnabled(false);
    buttonPic.setActionCommand("ChoosePic");
    buttonPic.addActionListener(this);

    labelPic = new JLabel();
    labelPic.setBounds(415, 30, 167, 210);
    frame.getContentPane().add(labelPic);




}



public void actionPerformed(ActionEvent event) {
    String command = event.getActionCommand();

     if (command.equals("ChoosePic")) {
        //TODO Label now cannot display images.
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        chooser.setAcceptAllFileFilterUsed(false);
        chooser.setFileFilter(new FileFilter() {
            public boolean accept (File f) {
                String extension = Utils.getExtension(f);
                if(extension != null) {
                    if (extension.equals(Utils.gif) ||
                        extension.equals(Utils.jpeg) ||
                        extension.equals(Utils.jpg) ||
                        extension.equals(Utils.png) ||
                        extension.equals(Utils.tif) ||
                        extension.equals(Utils.tiff)) {
                        return true;
                    }else{
                        return false;
                    }
                }
                return false;
            }

            public String getDescription() {
                return "Image File (*.gif, *.jpeg, *.jpg, *.png, *.tif, *.tiff)";
            }

        });

        int retVal = chooser.showOpenDialog(frame);
        if (retVal == JFileChooser.APPROVE_OPTION) {
            picFile = chooser.getSelectedFile();
            try {
                image = ImageIO.read(picFile);
            } catch (IOException e) {

                e.printStackTrace();
            }

            // Calculate the pic's ratio and do re-scale

            double ratio = (double) labelPic.getWidth() / (double) labelPic.getHeight();
            // Do image scale, scaledW is the new Width, and LabelPic.getHeight is the new Height.
            int scaledW = (int) (image.getHeight() * ratio);
            image = new BufferedImage(scaledW, labelPic.getHeight(), BufferedImage.SCALE_FAST);
            ImageIcon icon = new ImageIcon(image);

            labelPic.setVisible(true);
            labelPic.setIcon(icon);
            labelPic.revalidate();
            labelPic.repaint();

        }


    }
}
}

我还引用了其他类似的问题:

image loading using a JFileChooser into a JFrame

Image won't display in JLabel

Updating an image contained in a JLabel - problems

外部网站:JFIleChooser opening image to JLabel

以及Java Tutorial Docs How to Use Buttons, Check Boxes, and Radio Buttons

但我仍然无法弄清楚为什么JLabel不显示所选择的图像。

感谢您的帮助伙伴们!

2 个答案:

答案 0 :(得分:1)

好的,我终于弄清楚代码有什么问题:

如果我打算使用BufferedImage来调整大小(抱歉,在我的问题中我误解了方法scaleresize),我需要使用drawImage方法“重绘”图像。否则图像将不会显示。

我在这里做了修改:

double ratio = (double) labelPic.getWidth() / (double) labelPic.getHeight();
        // Do image scale, scaledW is the new Width, and LabelPic.getHeight is the new Height.
        int scaledW = (int) (image.getHeight() * ratio);
        image = new BufferedImage(scaledW, labelPic.getHeight(), BufferedImage.SCALE_FAST);// Edit here
        ImageIcon icon = new ImageIcon(image);

        labelPic.setVisible(true);
        labelPic.setIcon(icon);
        labelPic.revalidate();
        labelPic.repaint();

从“编辑此处”标记,我使用以下代码:

BufferedImage imageTemp = new BufferedImage(resizedW, resizedH, BufferedImage.TYPE_INT_RGB);
            imageTemp.getGraphics().drawImage(image,0,0, scaledW, scaledH, null);
            image = imageTemp;

首先将值传递给imageTemp然后传递给image并直接将值传递给image之间存在差异。如果我将new BufferedImage直接传递给image,它将显示纯黑色而不是您选择的图像。

答案 1 :(得分:0)

尝试使用它来显示图像:

        JfileChooser getImage = new JFileChooser();
        ..........

        ImageIcon imagePath= new ImageIcon(getImage.getPath());

        JLabel imageLabel= new JLabel() {

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(imagePath.getImage(), 0, 0, width, height, null);
            }
        };
        imageLabel.setLocation(10, 40);
        imageLabel.setBorder(viewAnimalPanelBorder);
        imageLabel.setSize(200, newHeight);
        panel.add(imageLabel);

如果您需要更多帮助,请与我们联系。

另外,尝试在不使用JFileChooser的情况下显示图片,也可以硬编码测试路径。