0

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

最初,我设法在 中显示所选图像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();

        }


    }
}
}

我还参考了其他类似的问题:

使用 JFileChooser 将图像加载到 JFrame

图像不会在 JLabel 中显示

更新 JLabel 中包含的图像 - 问题

外部站点:JFIleChooser 将图像打开到 JLabel

以及 Java 教程文档 如何使用按钮、复选框和单选按钮

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

感谢热心帮忙的小伙伴们!

4

2 回答 2

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,它将显示纯黑色而不是您选择的图像。

于 2012-07-06T20:23:48.587 回答
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 的情况下显示图片,可能会硬编码测试路径。

于 2012-07-06T12:54:52.180 回答