【问题标题】:JfileChooser wont show image selected inside JpanelJfileChooser 不会显示在 Jpanel 中选择的图像
【发布时间】:2011-10-07 07:55:58
【问题描述】:

当使用 Java 的 JFileChooser 进行选择时,我无法在 Jpanel 中显示图像。我还希望所选图像自动调整大小并适合我的 Jpanel 的设置大小?

这是我到目前为止编写的代码。 JfileChooser 显示在一个新的 JFrame 中,当图像成功上传并在 Jpanel 中查看时,我还想关闭此 Jframe。

这里是上传按钮,应该打开 JFileChooser,允许选择文件然后上传图像(要调整大小,需要帮助如何使图像自动调整大小),然后在图像时关闭 Jframe“框架”是否显示在 Jpanel“PicturePanel”中?

编辑:添加了我想要完成的 SSCCE。

我想在单击“上传”按钮后,显示适当大小的图像(必须适合 JPANEl“图片面板”) 在黑色边框面板中显示图像。

import classes.BackgroundPanel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.swing.*;
import javax.imageio.ImageIO;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Test   {
public static void main(String[] args) {
    final JFileChooser chooser = new JFileChooser();
    JButton button = new JButton();
    button.setText("Upload");
    JFrame frame = new JFrame("My Frame");
    final JFrame imageFrame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JFileChooser fc = new JFileChooser();
    final Test_Image t = new Test_Image();
    JPanel panel = new JPanel();
    JPanel picturePanel = new JPanel();
 //  chooser.showOpenDialog(null);
      Dimension d = new Dimension(1261, 765);
      Dimension d2 = new Dimension(1300, 900);
      picturePanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
      panel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
      Dimension d3 = new Dimension(343, 247);
      picturePanel.setSize(d3);
        //picturePanel.setSize(d);
      panel.add(button);
      panel.setSize(d3);


    //panel.setVisible(true);
   //panel.add(picturePanel);

   button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            if(chooser.showOpenDialog(imageFrame) == JFileChooser.APPROVE_OPTION) {

                try {
                    Image bi = ImageIO.read(
                    chooser.getSelectedFile());
                    BackgroundPanel bp = new BackgroundPanel(bi);
                    if (bi != null)
                    bp.setImage(bi);
                    else
                    JOptionPane.showMessageDialog(imageFrame,
                    "File is not an image!");
                    } catch (IOException ioe) {
                    JOptionPane.showMessageDialog(imageFrame,
                    "Error Reading File!");
                 }                
            }                              

        }
    });      


  frame.setSize(d2);
  frame.add(picturePanel).setLocation(100, 100);
  frame.add(panel);
  frame.setVisible(true);

 }

}

【问题讨论】:

    标签: java image swing jpanel jfilechooser


    【解决方案1】:

    当动态移除/添加组件时,基本代码应该是:

    panel.add(...);
    panel.revalidate();
    panel.repaint();
    

    我不知道这是否是问题所在,因为您没有发布 SSCCE。如果您需要更多帮助,请发布适当的 SSCCE。

    在如何使图像自动调整大小方面需要帮助),

    那么你不能使用 JLabel。您需要进行自定义绘画并使用 Graphics.drawImage(....) 方法。

    您可以查看Background Panel,它允许您绘制缩放或平铺的图像(除其他外)。

    【讨论】:

    • 我不知道我可以发布的代码的任何其他部分。您提到自定义绘画,这是创建一个扩展 Graphics 类的新类吗?如果我有面板大小,我可以使用 drawImage() 方法设置图像大小吗?
    • 您阅读了 SSCCE 链接吗?您发布的代码如何可编译。由于您从未将按钮添加到框架中,我们如何执行代码并单击按钮?我给了你一个自定义绘画的例子。下载该类并创建一个仅使用带有图像的 BackgroundPanel 类的 SSCCE。然后你可以按照代码来看看它是如何工作的。
    • 好的,谢谢您的帮助。我创建了一个测试类并使用 BackgroundPanel 类来显示和图像,这是我试图按照相同结构实现的功能。我有一个卡片布局面板应用程序,在该面板上我有一个按钮(上传图像),单击该按钮时会在单独的 Jframe 中显示 FileChooser。回到我的应用程序中,我添加了另一个 JPanel(将替换为背景面板),它将显示上传的图像。如果有什么方法可以给你看这个视图的截图,请告诉我。
    • 我不明白这个问题。 BackgroundPanel 类有一个 setImage() 方法,因此您可以在选择文件后读取图像后轻松更改图像。截图没有帮助,这就是你需要发布 SSCCE 的原因。
    • 我将使用简单的框架和面板重新创建错误,同时将上述按钮添加到我的框架。谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2017-08-02
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多