为什么 BufferedImage 在 JLabel 中不显示完整图像? [英] why BufferedImage does not show full image in JLabel?

查看:47
本文介绍了为什么 BufferedImage 在 JLabel 中不显示完整图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在从 JFileChooser 获取文件并通过使用 BufferedImage 读取并放入 JLabels 来显示它们,但存在一个问题,即我的图像没有完全显示在 JLabels 中.这是我的代码

I am getting files from JFileChooser and showing them by reading with BufferedImage and putting in JLabels but there is a problem that my images are not completely shown in JLabels. Here is my code

public class ImagePreview
{
    JPanel PicHolder= new JPanel();
    public ImagePreview()
    {
        JButton GetImages = new JButton("Browse Images");
        GetImages.addMouseListener(new MouseAdapter() 
        {
            public void mouseClicked(MouseEvent evt) 
            {
                 CreatePreviews();
            };
        });
        PicHolder.add(GetImages);

        JFrame MainFrame = new JFrame("Image Preview");
        MainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MainFrame.getContentPane().add(PicHolder);
        MainFrame.pack();
        MainFrame.setVisible(true);
    }
    public void CreatePreviews()
    {
        JFileChooser chooser = new JFileChooser();
        chooser.setMultiSelectionEnabled(true);
        File[] selectedCarImages = chooser.getSelectedFiles();
        for(int a=0; a<selectedImages.length; a++)
        {
            try
            {
                BufferedImage myPicture = ImageIO.read(new File(selectedImages[a].getAbsolutePath()));
                JLabel picLabel = new JLabel(new ImageIcon(myPicture));
                PicHolder.add(picLabel);
            }
        }
    }

    public static void main(String[] args) 
    {
          java.awt.EventQueue.invokeLater(() -> {
                 new ImagePreview();
          });
    }
}

当我运行此代码时,它会显示用户选择的图像,但它们是自动裁剪的,并没有完全显示在 JLabels 中.

When I run this code, it shows user selected images but they are kind of automatically croped and not showing completely in JLabels.

这里有什么问题?为什么 JLabels 不显示完整图像?

What's wrong here? Why JLabels do not show full images?

推荐答案

您将所有组件和图像添加到具有默认 FlowLayout 的单个面板中.相反,使用 GridLayout 作为图片标签,并将浏览按钮添加到框架的默认 BorderLayout,如下所示.

You're adding all the components and images to a single panel having the default FlowLayout. Instead, use GridLayout for the picture labels and add the browse button to the frame's default BorderLayout, as shown below.

经测试:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
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.JPanel;
import javax.swing.JScrollPane;

public class ImagePreview {

    JFrame mainFrame = new JFrame("Image Preview");
    JPanel picHolder = new JPanel(new GridLayout(0, 1));

    public ImagePreview() {
        JButton getImages = new JButton("Browse Images");
        getImages.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent evt) {
                CreatePreviews();
            }
        });
        mainFrame.add(getImages, BorderLayout.NORTH);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.add(new JScrollPane(picHolder));
        mainFrame.pack();
        mainFrame.setLocationByPlatform(true);
        mainFrame.setVisible(true);
    }

    public void CreatePreviews() {
        JFileChooser chooser = new JFileChooser();
        chooser.setMultiSelectionEnabled(true);
        chooser.showOpenDialog(mainFrame);
        File[] selectedImages = chooser.getSelectedFiles();
        for (int a = 0; a < selectedImages.length; a++) {
            try {
                BufferedImage myPicture = ImageIO.read(new File(selectedImages[a].getAbsolutePath()));
                JLabel picLabel = new JLabel(new ImageIcon(myPicture));
                picHolder.add(picLabel);
                mainFrame.pack();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(() -> {
            new ImagePreview();
        });
    }
}

这篇关于为什么 BufferedImage 在 JLabel 中不显示完整图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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