我想重写一个图片预览对话框,类似qq你点发送图片那个按钮,弹出一个对话框,让你在磁盘上找图片,当你在磁盘上找到图片时,点击,能够在旁边预览一下,不合适可以选别的。在java中,你用jfilechooser,filedialog没有图片预览,并且不能将这两个和一个jlabel组合起来放到一个jframe上。我后来自己写了一个对话框,在选择一个磁盘之后,不知道如何让上面的一个框出现磁盘现在目录下的文件,也就是不知道这个框用什么控件和如何让磁盘目录下的内容显示在这个框里。
不知道我说清楚了没有,我们老师让写的一个程序用到了这个,想了几天了,没有办法,一定要帮帮我呀。
不知道我说清楚了没有,我们老师让写的一个程序用到了这个,想了几天了,没有办法,一定要帮帮我呀。
* JPhotoChooser.java
*
* Created on 2007年10月25日, 下午2:51
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package mobi.chenwei.wing.swing;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;/**
* 图像文件选取对话框。
* 提供图像预览功能。
*
* @author Chen Wei
* @website www.chenwei.mobi
* @email [email protected]
*/
public class JPhotoChooser extends JValidateFileChooser { private Accessory accessory = null; public JPhotoChooser() {
super();
initComponents();
} public JPhotoChooser(File currentDirectory) {
super(currentDirectory);
initComponents();
} public JPhotoChooser(File currentDirectory, FileSystemView fsv) {
super(currentDirectory, fsv);
initComponents();
} public JPhotoChooser(FileSystemView fsv) {
super(fsv);
initComponents();
} public JPhotoChooser(String currentDirectoryPath) {
super(currentDirectoryPath);
initComponents();
} public JPhotoChooser(String currentDirectoryPath, FileSystemView fsv) {
super(currentDirectoryPath, fsv);
initComponents();
} private void initComponents() {
accessory = new Accessory(); setAccessory(accessory);
addPropertyChangeListener(accessory);
this.setAcceptAllFileFilterUsed(false);
this.addChoosableFileFilter(PhotoFileFilter.FILTER_BMP);
this.addChoosableFileFilter(PhotoFileFilter.FILTER_GIF);
this.addChoosableFileFilter(PhotoFileFilter.FILTER_JPEG);
this.addChoosableFileFilter(PhotoFileFilter.FILTER_PNG);
this.addChoosableFileFilter(PhotoFileFilter.FILTER_IMAGEIOSUPPORT);
} public boolean isPreview() {
return accessory.isPreview();
} public void setPreview(boolean b) {
accessory.setPreview(b);
} public void clearFilters() {
FileFilter[] filters = this.getChoosableFileFilters();
for (FileFilter f : filters) {
this.removeChoosableFileFilter(f);
}
} class Accessory extends JPanel implements PropertyChangeListener, ItemListener { private JCanvas canvas = new JCanvas();
private JCheckBox ckbPreview = new JCheckBox("preview");
private File file = null; private Accessory() {
setLayout(new BorderLayout());
setPreferredSize(new Dimension(150, 150));
setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
add(canvas, BorderLayout.CENTER);
add(ckbPreview, BorderLayout.SOUTH); ckbPreview.addItemListener(this);
ckbPreview.setFocusPainted(false);
} boolean isPreview() {
return ckbPreview.isSelected();
} void setPreview(boolean b) {
ckbPreview.setSelected(b);
} @Override
public void propertyChange(PropertyChangeEvent evt) {
if (ckbPreview.isSelected()) {
String name = evt.getPropertyName();
if (name.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) {
if (isMultiSelectionEnabled()) {
file = null;
} else {
file = getSelectedFile();
}
} else if (name.equals(JFileChooser.SELECTED_FILES_CHANGED_PROPERTY)) {
File[] files = getSelectedFiles();
if (files.length > 0) {
file = files[files.length - 1];
}
} else {
file = null;
} if (file != null && file.isFile()) {
BufferedImage image = read(file);
refurbish(image);
} else {
canvas.setImage(null);
}
canvas.repaint();
}
} @Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (JPhotoChooser.this.isMultiSelectionEnabled()) {
File[] files = JPhotoChooser.this.getSelectedFiles();
if (files.length > 0) {
file = files[files.length - 1];
}
} else {
file = JPhotoChooser.this.getSelectedFile();
}
} else {
file = null;
}
BufferedImage image = read(file);
refurbish(image);
} private BufferedImage read(File file) {
try {
return ImageIO.read(file);
} catch (IOException ex) {
return null;
} catch (Exception ex) {
return null;
}
} private void refurbish(BufferedImage image) {
if (image != null) {
double scale = calculateBestFitScale(image.getWidth(), image.getHeight(), canvas.getWidth(), canvas.getHeight());
canvas.setScale(scale);
}
canvas.setImage(image);
canvas.repaint();
} private double calculateBestFitScale(int imageWidth, int imageHeight, int cancvsWidth, int cancvsHeight) {
double scale = 1.0;
if (imageWidth <= cancvsWidth && imageHeight <= cancvsHeight) {
scale = 1.0;
} else {
double imageRatio = (double) imageWidth / (double) imageHeight;
double canvasRatio = (double) cancvsWidth / (double) cancvsHeight; if (imageRatio > canvasRatio) {
scale = (double) cancvsWidth / (double) imageWidth;
} else {
scale = (double) cancvsHeight / (double) imageHeight;
}
} return scale;
}
}
}
* PhotoFileFilter.java
*
* Created on 2007年10月25日, 下午3:52
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package mobi.chenwei.wing.swing;import java.io.File;
import java.io.Serializable;
import java.util.Locale;
import javax.swing.filechooser.FileFilter;/**
* 图片格式过滤器
*
* @author Chen Wei
* @website www.chenwei.mobi
* @email [email protected]
*/
public final class PhotoFileFilter extends FileFilter implements Serializable { public static final PhotoFileFilter FILTER_JPEG = new PhotoFileFilter("JPEG Image Format (*.jpeg; *.jpg)", "jpeg", "jpg");
public static final PhotoFileFilter FILTER_PNG = new PhotoFileFilter("Portable Network Graphics (*.png)", "png");
public static final PhotoFileFilter FILTER_BMP = new PhotoFileFilter("Windows Bitmap (*.bmp)", "bmp");
public static final PhotoFileFilter FILTER_GIF = new PhotoFileFilter("Gif Image Format (*.gif)", "gif");
public static final PhotoFileFilter FILTER_IMAGEIOSUPPORT = new PhotoFileFilter("All Image Format", "jpeg", "jpg", "png", "bmp", "gif");
private final String description;
private final String[] extensions;
private final String[] lowerCaseExtensions; public PhotoFileFilter(String description, String... extensions) {
if (extensions == null || extensions.length == 0) {
throw new IllegalArgumentException("Extensions must be non-null and not empty");
}
this.description = description;
this.extensions = new String[extensions.length];
this.lowerCaseExtensions = new String[extensions.length];
for (int i = 0; i < extensions.length; i++) {
if (extensions[i] == null || extensions[i].length() == 0) {
throw new IllegalArgumentException("Each extension must be non-null and not empty");
}
this.extensions[i] = extensions[i];
lowerCaseExtensions[i] = extensions[i].toLowerCase(Locale.ENGLISH);
}
} public boolean accept(File f) {
if (f != null) {
if (f.isDirectory()) {
return true;
}
// NOTE: we tested implementations using Maps, binary search
// on a sorted list and this implementation. All implementations
// provided roughly the same speed, most likely because of
// overhead associated with java.io.File. Therefor we've stuck
// with the simple lightweight approach.
String fileName = f.getName();
int i = fileName.lastIndexOf('.');
if (i > 0 && i < fileName.length() - 1) {
String desiredExtension = fileName.substring(i + 1).toLowerCase(Locale.ENGLISH);
for (String extension : lowerCaseExtensions) {
if (desiredExtension.equals(extension)) {
return true;
}
}
}
}
return false;
} public String getDescription() {
return description;
} public String[] getExtensions() {
String[] result = new String[extensions.length];
System.arraycopy(extensions, 0, result, 0, extensions.length);
return result;
} public int getExtensionsCount() {
if (extensions == null) {
return 0;
} else {
return extensions.length;
}
} @Override
public boolean equals(Object obj) {
boolean flag = false;
if (obj != null && obj instanceof PhotoFileFilter) {
PhotoFileFilter filter = (PhotoFileFilter) obj;
if (getExtensionsCount() > 0 && getExtensionsCount() == filter.getExtensionsCount()) {
String[] extensions0 = getExtensions();
String[] extensions1 = filter.getExtensions(); for (String e : extensions0) {
flag = false; for (int i = 0; i < extensions1.length; i++) {
if (e.equals(extensions1[i])) {
flag = true;
continue;
}
} if (flag == false) {
break;
}
} return flag;
} else {
return flag;
}
} else {
return flag;
}
} @Override
public String toString() {
return super.toString() + "[description=" + getDescription() + " extensions=" + java.util.Arrays.asList(getExtensions()) + "]";
}
}
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package mobi.chenwei.wing.swing;import java.io.File;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileSystemView;/**
* 带文件有效验证的文件选择对话框。
*
* @author Chen Wei
* @website www.chenwei.mobi
* @email [email protected]
*/
public class JValidateFileChooser extends javax.swing.JFileChooser { public JValidateFileChooser() {
super();
} public JValidateFileChooser(File currentDirectory) {
super(currentDirectory);
} public JValidateFileChooser(File currentDirectory, FileSystemView fsv) {
super(currentDirectory, fsv);
} public JValidateFileChooser(FileSystemView fsv) {
super(fsv);
} public JValidateFileChooser(String currentDirectoryPath) {
super(currentDirectoryPath);
} public JValidateFileChooser(String currentDirectoryPath, FileSystemView fsv) {
super(currentDirectoryPath, fsv);
} /**
* 超类的这个方法会在用户确定选择操作时由 UI 调用,
* 现在覆写这个方法在其中进行有效性验证。
*/
@Override
public void approveSelection() {
File file = getSelectedFile(); // 验证文件名是否合法,合法文件名不能包含 '\', '/', ':', '*', '?', '"', '<', '>', '|' 等字符。
if (!validateFileName(file.getName())) {
JOptionPane.showMessageDialog(getParent(), "Invalid file name or path.", "WARNING", JOptionPane.WARNING_MESSAGE);
return;
} // 检查选中的文件是否存在。
if (!file.exists()) {
JOptionPane.showMessageDialog(getParent(), "Can not find the requested file.", "WARNING", JOptionPane.WARNING_MESSAGE);
return;
} super.approveSelection();
}
public boolean validateFileName(String name) {
if (name.indexOf('\\') != -1 || name.indexOf('/') != -1 || name.indexOf(':') != -1 || name.indexOf('*') != -1 || name.indexOf('?') != -1 || name.indexOf('"') != -1 || name.indexOf('<') != -1 || name.indexOf('>') != -1 || name.indexOf('|') != -1) { return false;
} else {
return true;
} }
}