当前位置: 首页 > 知识库问答 >
问题:

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

关玮
2023-03-14

我遇到一个问题,当我尝试显示一个图像后,我点击一个按钮并选择图像文件在“选择文件对话框”。

最初,我设法在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();

        }


    }
}
}

我还提到了其他类似的问题:

更新JLabel中包含的图像-problems

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

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

共有1个答案

鲁烨
2023-03-14

好了,我终于弄明白代码出了什么问题:

如果我打算使用BufferedImage调整大小(对不起,在我的问题中,我误解了Scale方法和resize),我需要使用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;
 类似资料:
  • 问题内容: 这是我的代码。它不会在框架中显示图像,而是显示一些文本。有人可以建议我,我应该对代码进行哪些更改,以便可以在框架中显示图像? 问题答案: 请注意,我不会以这种方式设计代码,但是我希望使它尽可能接近原始代码,同时使其能够在基于Windows的框中显示图像列表。 列表显示

  • 问题内容: 我有一个表格可以 浏览并选择一个文件。 我要做的是在选择图像后立即显示该图像。而且这是在按下表单上的“提交”按钮之前,因此图像几乎可以肯定位于客户端。能做到吗? 问题答案: 干得好: HTML 脚本:

  • 问题内容: 我想使用Java读取文件夹中的所有图像。 什么时候: 我按下Java应用程序中的按钮, 它应该: 在弹出窗口中询问目录的路径, 然后 从该目录加载所有图像, 然后 显示其名称,尺寸类型和尺寸。 如何进行? 我有用于读取图像以及文件夹中所有图像的代码,但是我上面所说的事情如何完成? 欢迎任何建议或帮助!请提供参考链接! 问题答案: 未经测试,因为未在装有JDK的计算机上进行测试,所以请耐

  • 问题内容: 如何显示在PHP中使用file_get_contents检索到的图像? 我需要修改标题并仅回显它吗? 谢谢! 问题答案: 我需要修改标题并仅回显它吗? 究竟。 之后发送和数据。

  • 我写这篇文章是因为我需要一些帮助。我无法根据应用程序中的特定路径显示图像。 基本上它在做什么:我有一个名为扇区的模块,每个扇区都可以有一个与之相关的图像。当我使用Vaadin的上传组件时,我将图像的路径保存到我数据库中的一个表中,以便它可以显示之前选择的图片。 图像的实际路径很奇怪,似乎瓦丁将图像复制到了一个动态随机文件夹中。它不能使用图像的实际路径,这似乎是合乎逻辑的。 但问题是:路径在数据库中

  • 问题内容: 我的问题是,单击按钮后,它会显示目录中的所有文件供选择,然后所选的图像会正确显示在GUI中。但是,当我第二次单击“浏览”按钮时,它仅显示旧图像,而不显示新图像。请帮助我。 作为参考,我上传了UI。 问题答案: 每次选择新图像时,都在这里不必要地创建了组件,并且错误地出现在这里: 相反,我建议你在选择任何文件/图像之前,从一开始就创建所有这些组件,然后在此方法中,根据图像创建一个Imag