2010-10-29 64 views
3

我学习Swing和写的应用程序,让用户选择一个图像文件,并将其显示在JPanel。它的工作原理,但我想处理的情况时如何处理图像显示错误的文件选择在摇摆

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

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

我试图这样做,因为below.But我不知道这是否是这样做pro​​perly.I想你的建议的方式。

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); 
    } 
} 
+0

是文件选择出现,但没有图像。顺便说一句,有一个“@”地址,除了你之外,没有人会收到你的问题的评论通知。 – trashgod 2010-10-29 20:44:34

+0

@trashgod:感谢help..I复制从上面的页面的代码,并通过filechooser..I选择当它粘贴到一个新的file..It显示图像不得不虽然最大化UI .. – markjason72 2010-10-30 05:49:17

回答

5

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

附录:您可能还想研究文章How to Use File ChoosersWorking with Images中的示例。

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

附录:这个更新,更简单revision延伸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); 
      } 
     }); 
    } 
} 
+0

我试过following..1.selected图像文件 - >显示确定.. 2.selected目录 - >前一图像文件从JPanel的清除,并且产生错误味精显示在文本area..This只会发生onlyif display.displayImage( “”)被称为..我知道这是一个肮脏的方式做它..是否有更好的方式清除图像?如果我删除了上面的调用,那么当选择一个目录时,ImagePanel的setImage()永远不会被调用。 – markjason72 2010-10-30 05:50:51

+0

@ markjason72:我已经详细阐述过了。 – trashgod 2010-10-30 19:29:29