浏览图像文件并使用Java Swing显示它

我的问题是,单击Browse按钮后,它会显示目录中的所有文件供选择,然后所选的图像会正确显示在GUI中。但是,当我第二次单击“浏览”按钮时,它仅显示旧图像,而不显示新图像。请帮助我。

作为参考,我上传了UI。

package GUI;

import java.awt.BorderLayout;

import java.awt.EventQueue;

import java.awt.Graphics2D;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.border.EmptyBorder;

import javax.swing.JLabel;

import javax.swing.JButton;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

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.swing.GroupLayout;

import javax.swing.GroupLayout.Alignment;

@SuppressWarnings("serial")

public class MainAppFrame extends JFrame {

private JPanel contentPane;

File targetFile;

BufferedImage targetImg;

public JPanel panel,panel_1;

private static final int baseSize = 128;

private static final String basePath =![enter image description here][1]

"C:\\Documents and Settings\\Administrator\\Desktop\\Images";

/**

* Launch the application.

*/

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

MainAppFrame frame = new MainAppFrame();

frame.setVisible(true);

frame.setResizable(false);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

/**

* Create the frame.

*/

public MainAppFrame() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 550, 400);

contentPane = new JPanel();

contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);

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

panel = new JPanel();

panel.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));

contentPane.add(panel, BorderLayout.WEST);

JButton btnBrowse = new JButton("Browse");

btnBrowse.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

browseButtonActionPerformed(e);

}

});

JLabel lblSelectTargetPicture = new JLabel("Select target picture..");

JButton btnDetect = new JButton("Detect");

btnDetect.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

}

});

JButton btnAddDigit = new JButton("Add Digit");

btnAddDigit.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

}

});

JButton button = new JButton("Recognize");

button.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

}

});

panel_1 = new JPanel();

panel_1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));

GroupLayout gl_panel = new GroupLayout(panel);

gl_panel.setHorizontalGroup(

gl_panel.createParallelGroup(Alignment.LEADING)

.addGroup(gl_panel.createSequentialGroup()

.addGap(6)

.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)

.addGroup(gl_panel.createSequentialGroup()

.addComponent(lblSelectTargetPicture)

.addGap(6)

.addComponent(btnBrowse))

.addGroup(gl_panel.createSequentialGroup()

.addGap(10)

.addComponent(btnDetect)

.addGap(18)

.addComponent(btnAddDigit))))

.addGroup(gl_panel.createSequentialGroup()

.addGap(50)

.addComponent(button))

.addGroup(gl_panel.createSequentialGroup()

.addContainerGap()

.addComponent(panel_1, GroupLayout.PREFERRED_SIZE, 182, GroupLayout.PREFERRED_SIZE))

);

gl_panel.setVerticalGroup(

gl_panel.createParallelGroup(Alignment.LEADING)

.addGroup(gl_panel.createSequentialGroup()

.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)

.addGroup(gl_panel.createSequentialGroup()

.addGap(7)

.addComponent(lblSelectTargetPicture))

.addGroup(gl_panel.createSequentialGroup()

.addGap(3)

.addComponent(btnBrowse)))

.addGap(18)

.addComponent(panel_1, GroupLayout.PREFERRED_SIZE, 199, GroupLayout.PREFERRED_SIZE)

.addGap(22)

.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)

.addComponent(btnDetect)

.addComponent(btnAddDigit))

.addGap(18)

.addComponent(button)

.addContainerGap())

);

panel.setLayout(gl_panel);

}

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

panel_1.add(new JLabel(new ImageIcon(targetImg)));

setVisible(true);

}

private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {

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

setTarget(file);

} // Oops!

else {

JOptionPane.showMessageDialog(null,

"You must select one image to be the reference.", "Aborting...",

JOptionPane.WARNING_MESSAGE);

}

} catch (Exception iOException) {

}

}

}

//JPEGImageFileFilter.java

package GUI;

import java.io.File;

import javax.swing.filechooser.FileFilter;

/*

* This class implements a generic file name filter that allows the listing/selection

* of JPEG files.

*/

public class JPEGImageFileFilter extends FileFilter implements java.io.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";

}

}

回答:

每次选择新图像时,都在这里不必要地创建了组件,并且错误地出现在这里:

public void setTarget(File reference) {

//....

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

panel_1.add(new JLabel(new ImageIcon(targetImg)));

setVisible(true);

相反,我建议你在选择任何文件/图像之前,从一开始就创建所有这些组件,然后在此方法中,根据图像创建一个ImageIcon,然后简单地使用此Icon来设置已经存在的JLabel,而不是新的JLabel。只需调用myLabel.setIcon(new ImageIcon(targetImg));

以上是 浏览图像文件并使用Java Swing显示它 的全部内容, 来源链接: utcz.com/qa/413669.html

回到顶部