package com.gavin.gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Arrays;
import java.util.Locale;
import java.util.Vector;
import javax.accessibility.AccessibleContext;
import javax.swing.AbstractAction;
import javax.swing.AbstractListModel;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;
import javax.swing.filechooser.FileView;
import javax.swing.plaf.ActionMapUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.FileChooserUI;
import javax.swing.plaf.basic.BasicDirectoryModel;
import javax.swing.plaf.basic.BasicFileChooserUI;
import sun.awt.shell.ShellFolder;
import sun.swing.FilePane;
import sun.swing.SwingUtilities2;
@SuppressWarnings({ "serial" })
public class CustomFileChooser extends JFileChooser {
public static void main(String[] args) {
UIManager.put("ScrollBarUI", "com.sun.java.swing.plaf.windows.WindowsScrollBarUI");// 设置滚动条样式为window风格的滚动条样式
// 设置文件夹在swing中所显示的图标
UIManager.put("FileView.directoryIcon", FileSystemView.getFileSystemView().getSystemIcon(new File(System.getProperty("user.dir"))));
// 如果觉得默认的图标太丑可以自己设置文件选择对话框的一系列图标
// UIManager.put("FileChooser.newFolderIcon", newFolderIcon);
// UIManager.put("FileChooser.upFolderIcon", upFolderIcon);
// UIManager.put("FileChooser.homeFolderIcon", homeFolderIcon);
// UIManager.put("FileChooser.detailsViewIcon", detailsViewIcon);
// UIManager.put("FileChooser.listViewIcon", listViewIcon);
// 设置工具提示的默认样式
Color toolTipColor = new Color(80, 80, 80);
UIManager.put("ToolTip.border",
BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(toolTipColor), BorderFactory.createEmptyBorder(2, 3, 2, 3)));
UIManager.put("ToolTip.background", Color.WHITE);
UIManager.put("ToolTip.foreground", toolTipColor);
CustomFileChooser chooser = new CustomFileChooser();
chooser.showOpenDialog(null);
}
public CustomFileChooser() {
super();
}
public CustomFileChooser(File currentDirectory, FileSystemView fsv) {
super(currentDirectory, fsv);
}
public CustomFileChooser(File currentDirectory) {
super(currentDirectory);
}
public CustomFileChooser(FileSystemView fsv) {
super(fsv);
}
public CustomFileChooser(String currentDirectoryPath, FileSystemView fsv) {
super(currentDirectoryPath, fsv);
}
public CustomFileChooser(String currentDirectoryPath) {
super(currentDirectoryPath);
}
{
setUI(new CustomFileChooserUI(this));
}
@Override
protected JDialog createDialog(Component parent) throws HeadlessException {
FileChooserUI ui = getUI();
String title = ui.getDialogTitle(this);
putClientProperty(AccessibleContext.ACCESSIBLE_DESCRIPTION_PROPERTY, title);
Window window = getWindowForComponent(parent);
JDialog dialog = new JDialog(window, title);
dialog.setModal(true);
dialog.setComponentOrientation(this.getComponentOrientation());
if (JDialog.isDefaultLookAndFeelDecorated()) {
boolean supportsWindowDecorations = UIManager.getLookAndFeel().getSupportsWindowDecorations();
if (supportsWindowDecorations) {
dialog.getRootPane().setWindowDecorationStyle(JRootPane.FILE_CHOOSER_DIALOG);
}
}
dialog.getRootPane().setDefaultButton(ui.getDefaultButton(this));
dialog.getContentPane().add(this);
dialog.pack();
setLocationRelativeTo(parent, dialog);
return dialog;
}
/**
* 自定义文件选择器UI,代码主要来源于MetalFileChooserUI
*
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static class CustomFileChooserUI extends BasicFileChooserUI {
private static Font labelFont14 = new Font(Font.DIALOG, Font.PLAIN, 14);
private static Font labelFont12 = new Font(Font.DIALOG, Font.PLAIN, 12);
private static Color boxBorderColor = Color.GRAY;
private static Color boxForegroundColor = new Color(51, 51, 51);
// private static int boxHeight = 25;
// private static int buttonWidth=30;
// private static int buttonHeight=30;
// Much of the Metal UI for JFilechooser is just a copy of
// the windows implementation, but using Metal themed buttons, lists,
// icons, etc. We are planning a complete rewrite, and hence we've
// made most things in this class private.
private BasicFileView fileView = new CustomFileView();
private JLabel lookInLabel;
private CustomComboBox directoryComboBox;
private DirectoryComboBoxModel directoryComboBoxModel;
private Action directoryComboBoxAction = new DirectoryComboBoxAction();
private FilterComboBoxModel filterComboBoxModel;
private JTextField fileNameTextField;
private FilePane filePane;
private JToggleButton listViewButton;
private JToggleButton detailsViewButton;
private JButton approveButton;
private JButton cancelButton;
private JPanel buttonPanel;
private JPanel bottomPanel;
private CustomComboBox filterComboBox;
private static final Dimension hstrut5 = new Dimension(5, 1);
// private static final Dimension hstrut11 = new Dimension(11, 1);
private static final Dimension vstrut5 = new Dimension(1, 5);
private static final Insets shrinkwrap = new Insets(0, 0, 0, 0);
// Preferred and Minimum sizes for the dialog box
private static int PREF_WIDTH = 500;
private static int PREF_HEIGHT = 326;
private static Dimension PREF_SIZE = new Dimension(PREF_WIDTH, PREF_HEIGHT);
private static int MIN_WIDTH = 500;
private static int MIN_HEIGHT = 326;
private static Dimension MIN_SIZE = new Dimension(MIN_WIDTH, MIN_HEIGHT);
private static int LIST_PREF_WIDTH = 405;
private static int LIST_PREF_HEIGHT = 135;
private static Dimension LIST_PREF_SIZE = new Dimension(LIST_PREF_WIDTH, LIST_PREF_HEIGHT);
// Labels, mnemonics, and tooltips (oh my!)
private int lookInLabelMnemonic = 0;
private String lookInLabelText = null;
private String saveInLabelText = null;
private int fileNameLabelMnemonic = 0;
private String fileNameLabelText = null;
private i