Browse for image file and display it using Java Swing

回眸只為那壹抹淺笑 提交于 2019-11-26 12:30:38

Each time a new image is selected, you're creating components unnecessarily and in error here:

public void setTarget(File reference) {
    //....
    panel_1.setLayout(new BorderLayout(0, 0));
    panel_1.add(new JLabel(new ImageIcon(targetImg))); 
    setVisible(true);

Instead I would recommend that you have all these components created from the get-go, before any file/image has been selected, and then in this method, create an ImageIcon from the Image, and then simply use this Icon to set the Icon of an already existng JLabel rather than a new JLabel. This is done simply by calling myLabel.setIcon(new ImageIcon(targetImg));

Create an ImageViewer with method like ImageViewer.setImage(Image), display the image in a JLabel.

ImageViewer

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.Random;

public class ImageViewer {

    JPanel gui;
    /** Displays the image. */
    JLabel imageCanvas;

    /** Set the image as icon of the image canvas (display it). */
    public void setImage(Image image) {
        imageCanvas.setIcon(new ImageIcon(image));
    }

    public void initComponents() {
        if (gui==null) { 
            gui = new JPanel(new BorderLayout());
            gui.setBorder(new EmptyBorder(5,5,5,5));
            imageCanvas = new JLabel();

            JPanel imageCenter = new JPanel(new GridBagLayout());
            imageCenter.add(imageCanvas);
            JScrollPane imageScroll = new JScrollPane(imageCenter);
            imageScroll.setPreferredSize(new Dimension(300,100));
            gui.add(imageScroll, BorderLayout.CENTER);
        }
    }

    public Container getGui() {
        initComponents();
        return gui;
    }

    public static Image getRandomImage(Random random) {
        int w = 100 + random.nextInt(400);
        int h = 50 + random.nextInt(200);
        BufferedImage bi = new BufferedImage(
                w,h,BufferedImage.TYPE_INT_RGB);

        return bi;
    }

    public static void main(String[] args) throws Exception {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame("Image Viewer");
                // TODO Fix kludge to kill the Timer
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                final ImageViewer viewer = new ImageViewer();
                f.setContentPane(viewer.getGui());

                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);

                ActionListener animate = new ActionListener() {

                    Random random = new Random();

                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        viewer.setImage(getRandomImage(random));
                    }
                };
                Timer timer = new Timer(1500,animate);
                timer.start();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

I modified your code , I hope it will fulfill your requirement. I use MigLayout (it is a Layout manager) to arrange the component.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
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.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;

public class MyFileChooser
{

JFrame frame; 
JPanel panel;
JButton btnBrowse;
JButton change;
JLabel imglabel;

File targetFile;
BufferedImage targetImg;
private static final int baseSize = 128;
private static final String basePath ="/images/fimage";
JPanel panel_1;
ImageIcon icon;
public MyFileChooser() 
{
    // TODO Auto-generated constructor stub
    frame =new JFrame();
    frame.setLayout(new MigLayout());

    frame.setSize(300, 300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     panel=new JPanel(new MigLayout());
     panel_1 = new JPanel();
     panel_1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(5, 5, 5), 1, true));

     panel_1.setBackground(Color.pink);

     btnBrowse=new JButton("browse");
     btnBrowse.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            browseButtonActionPerformed(e);
        }
    });

    change=new JButton("Delete");
    change.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) 
        {
            // TODO Auto-generated method stub
            changeButtonActionPerformed(e);

        }

        private void changeButtonActionPerformed(ActionEvent e) 
        {
            // TODO Auto-generated method stub

               imglabel.revalidate(); //ADD THIS AS WELL
               imglabel.repaint();  //ADD THIS AS WELL
               imglabel.setIcon(null);
               System.out.println("delete button activated");

        }
    });


    imglabel=new JLabel("Image");
    imglabel.setSize(100, 100);
    imglabel.setBackground(Color.yellow);
    frame.add(panel_1,"span,pushx,pushy,growx,growy");
    frame.add(btnBrowse);
    frame.add(change,"");

    //frame.pack();



}

protected void browseButtonActionPerformed(ActionEvent e) 
{


    JFileChooser fc = new JFileChooser(basePath);
    fc.setFileFilter(new JPEGImageFileFilter());
    int res = fc.showOpenDialog(null);
    // We have an image!
    try {
        if (res == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            imglabel.setIcon(null);
           setTarget(file);
        } // Oops!
        else {
            JOptionPane.showMessageDialog(null,
                    "You must select one image to be the reference.", "Aborting...",
                    JOptionPane.WARNING_MESSAGE);
        }
    } catch (Exception iOException) {
    }

}

public BufferedImage rescale(BufferedImage originalImage)
{
    BufferedImage resizedImage = new BufferedImage(baseSize, baseSize, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(originalImage, 0, 0, baseSize, baseSize, null);
    g.dispose();
    return resizedImage;
}
public void setTarget(File reference)
{

    try {
        targetFile = reference;
        targetImg = rescale(ImageIO.read(reference));
    } catch (IOException ex) {
       // Logger.getLogger(MainAppFrame.class.getName()).log(Level.SEVERE, null, ex);
    }

    panel_1.setLayout(new BorderLayout(0, 0));

    icon=new ImageIcon(targetImg);
    imglabel=new JLabel(icon);
    panel_1.add(imglabel); 

    frame.setVisible(true);
}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            new MyFileChooser();

        }
    });
}

}

JPEGImageFileFilter class , you can keep this class in same pakage

import java.io.File;

import javax.swing.filechooser.FileFilter;

public class JPEGImageFileFilter extends FileFilter implements    FileFilter           
{
public boolean accept(File f)
{
  if (f.getName().toLowerCase().endsWith(".jpeg")) return true;
  if (f.getName().toLowerCase().endsWith(".jpg")) return true;
 if(f.isDirectory())return true;
 return false;
}
public String getDescription()
{
  return "JPEG files";
}

} 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!