【问题标题】:Show Image selected from JFileChooser in a set sized JPanel (image must be re-scaled)在设置大小的 JPanel 中显示从 JFileChooser 中选择的图像(必须重新缩放图像)
【发布时间】:2011-07-19 14:16:42
【问题描述】:

我正在尝试使图像适合设置大小的 JPanel(图片面板---黑色边框线)(必须适合 JPANEl“图片面板”)。当我单击上传按钮时,我可以在新的 JFrame 中看到 JFilechooser 并选择我想要的图片,但是在“打开”按钮单击后没有任何反应。

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);

    }

}

【问题讨论】:

  • 我假设您在 BackgroundPanel 中绘制图像并使用适当的 drawImage 重载根据需要重新调整它——正确(显示 BackgroundPanel 的代码会很好)?你在哪里添加你的 BackgroundPanel,bp,到图片面板或任何东西?
  • @Nivas,看来BackgroundPanel是@camickr创建的自定义类。
  • @HoverCraft,我正在尝试将所选图像添加到 BackGroundPanel 'bp' 并添加该面板以适合我的具有设定大小的图片面板。
  • @Warz:我的评论中仍有未回答的问题。请参阅我在下面发布的答案以了解更多详情。

标签: java image jpanel jfilechooser


【解决方案1】:
BackgroundPanel bp = new BackgroundPanel(bi); 

您不会将 BackgroundPane 添加到任何地方的框架中。动态添加组件的基本代码是:

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

如果您已经将 BackgroundPanel 添加到框架中,那么您应该能够只调用面板上的 setImage() 方法。因此,现在您需要更改代码以在从文件选择器中选择路径后使用 ImageIO.read(...) 读取图像。

【讨论】:

  • 是否在按钮操作执行后添加背景面板,因为如果我不在按钮操作侦听器方法中,我无法访问 bp?
  • 您不必为您的听众使用匿名内部类。您可以创建一个单独的 ActionListener 类,并在创建类时传入对 BackgroundPanel 的引用。现在您的听众可以访问面板了。
【解决方案2】:

再一次,我看不到您将 BackgroundPanel 添加到 picturePanel JPanel 的任何地方。您需要将picturePanel的布局设置为BorderLayout,然后将BackgroundPanel,bp添加到picturePanel的BorderLayout.CENTER位置,然后按照camickr显示的方式调用revalidate和repaint。

我们也看不到您的 BackgroundPanel 类的代码,即使我们已请求它。同样,我希望您在其 paintComponent 方法中绘制图像并使用适当的 drawImage 重载,但在您显示代码之前,我们无法确定。

【讨论】:

  • 背景面板类在这里(tips4java.wordpress.com/2008/10/12/background-panel)。谢谢您的帮助。我可以在按钮单击操作事件方法中执行所有提到的步骤吗?
  • @Warz:最好尝试一下并找出答案。
  • 我已经在背景面板“bp”中正确设置了图像,并且还使用 BorderLayout.Center 将 bp 作为组件添加到了我的图片面板中,然后调用了 picturePanel.revalidate 并在之后重新绘制但是仍然无法查看图像。我有打印语句显示找到了路径并且存在图像大小。
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 2013-06-17
  • 2011-05-05
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多