如何处理摆动中图像显示的错误文件选择

我正在学习Swing并编写了一个应用程序,允许用户选择一个图像文件并将其显示在JPanel 。 它有效,但我想处理时的情况

  1. 用户不选择任何文件
  2. 用户选择非图像文件

在这些情况下,我想清除JPanel并在文本区域显示错误消息。

我尝试这样做如下。但我不确定这是否是正确的方法。我想你的建议。

 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; class Display extends JFrame { private MyImagePanel canvas; private JButton okbutton; private JTextArea result; private JFileChooser filechooser; private static Insets insets = new Insets(0, 0, 0, 0); public Display(String name) { super(name); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new GridBagLayout()); addWidgets(); showGUI(); } private void showGUI() { this.pack(); this.setVisible(true); } private void addWidgets() { canvas = new MyImagePanel(); okbutton = new JButton("OK"); filechooser = new JFileChooser("Select imagefile"); FileNameExtensionFilter filter = new FileNameExtensionFilter( "Images", "jpg", "JPG", "GIF", "gif", "JPEG", "png", "PNG"); filechooser.setFileFilter(filter); filechooser.setControlButtonsAreShown(false); result = new JTextArea(10, 10); addComponent(filechooser, 0, 0, 2, 4, GridBagConstraints.CENTER, GridBagConstraints.NONE); addComponent(canvas, 2, 0, 2, 2, GridBagConstraints.CENTER, GridBagConstraints.NONE); addComponent(result, 2, 2, 2, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE); addComponent(okbutton, 3, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE); } public void addOKButtonListener(ActionListener okl) { okbutton.addActionListener(okl); } public void displayResult(String msg) { result.setText(msg); } public void clearResultField() { result.setText(""); } public void displayImage(String imagefilename) { canvas.setImage(imagefilename); } public String getSelectedFile() { java.io.File selectedFile = filechooser.getSelectedFile(); String filePathName = ""; if (selectedFile == null) { result.setText("select a file"); } else { filePathName = selectedFile.getPath(); } return filePathName; } public void addComponent(Component component, int gridx, int gridy, int gridwidth, int gridheight, int anchor, int fill) { GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 1.0, 1.0, anchor, fill, insets, 0, 0); this.add(component, gbc); } }//end class Display class MyImagePanel extends JPanel { private BufferedImage bi; public MyImagePanel() { super(); bi = null; } public void setImage(String imagefilename) { try { bi = ImageIO.read(new File(imagefilename)); this.setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight())); } catch (Exception e) { bi = null; } this.revalidate(); this.repaint(); } @Override public void paintComponent(Graphics g) { // clear the background g.setColor(getBackground()); g.fillRect(0, 0, getWidth(), getHeight()); if (bi != null) { // draw the image g.drawImage(bi, 0, 0, null); } } } class GUIController { private Display display; public GUIController(Display d) { display = d; display.addOKButtonListener(new OKButtonListener()); } class OKButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { display.clearResultField();//make result field blank String fileselection = display.getSelectedFile(); if (fileselection.length() > 0) { display.displayImage(fileselection); } else { display.displayResult("actionPerformed:no file selected"); display.displayImage(""); } } } } public class ImageDisplay { public static void main(String[] args) { Display d = new Display("image demo"); GUIController ctrl = new GUIController(d); } } 

java.awt.Graphics的几个drawImage()方法如果imgnullnull 。 因此,将图像设置为null就足够了。 您将明确清除背景,但super.paintComponent(g)是将面板清除为背景颜色的替代方法。

附录:您可能还想研究文章如何使用文件选择器使用图像中的示例。

附录:我使用了不同的布局,并将图像添加到JScrollPane 。 我也有setImage()返回一个结果让Display知道发生了什么。

附录:这个更新,更简单的版本扩展了JFileChooser以直接处理批准和取消。

 import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; /** @see https://stackoverflow.com/questions/4053090 */ public class ImageDisplay extends JFrame { private static final String title = "Select a file"; private MyImagePanel imagePanel = new MyImagePanel(); private JLabel result = new JLabel(title, JLabel.CENTER); private MyChooser fileChooser = new MyChooser(); public ImageDisplay(String name) { super(name); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.addWidgets(); this.pack(); this.setVisible(true); } private void addWidgets() { FileNameExtensionFilter filter = new FileNameExtensionFilter( "Images", "jpg", "JPG", "GIF", "gif", "JPEG", "png", "PNG"); fileChooser.setFileFilter(filter); this.add(fileChooser, BorderLayout.WEST); this.add(new JScrollPane(imagePanel), BorderLayout.CENTER); this.add(result, BorderLayout.SOUTH); } class MyChooser extends JFileChooser { @Override public void approveSelection() { File f = fileChooser.getSelectedFile(); if (imagePanel.setImage(f)) { result.setText(f.getName()); } else { result.setText(title); } } @Override public void cancelSelection() { imagePanel.setImage(null); result.setText(title); } } class MyImagePanel extends JPanel { private BufferedImage bi; public MyImagePanel() { this.setPreferredSize(new Dimension(500, 700)); } /** Return true if read() succeeded. */ public boolean setImage(File f) { try { bi = ImageIO.read(f); } catch (Exception e) { bi = null; } if (bi != null) { setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight())); } this.revalidate(); this.repaint(); return bi != null; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(bi, 0, 0, null); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new ImageDisplay("Image Demo").setVisible(true); } }); } }