📄 filechooserui.java
字号:
{
super.installStrings(fc);
Locale l= fc.getLocale();
lookInLabelMnemonic= UIManager.getInt("FileChooser.lookInLabelMnemonic");
lookInLabelText= UIManager.getString("FileChooser.lookInLabelText", l);
saveInLabelText= UIManager.getString("FileChooser.saveInLabelText", l);
fileNameLabelMnemonic=
UIManager.getInt("FileChooser.fileNameLabelMnemonic");
fileNameLabelText=
UIManager.getString("FileChooser.fileNameLabelText", l);
filesOfTypeLabelMnemonic=
UIManager.getInt("FileChooser.filesOfTypeLabelMnemonic");
filesOfTypeLabelText=
UIManager.getString("FileChooser.filesOfTypeLabelText", l);
upFolderToolTipText=
UIManager.getString("FileChooser.upFolderToolTipText", l);
upFolderAccessibleName=
UIManager.getString("FileChooser.upFolderAccessibleName", l);
homeFolderToolTipText=
UIManager.getString("FileChooser.homeFolderToolTipText", l);
homeFolderAccessibleName=
UIManager.getString("FileChooser.homeFolderAccessibleName", l);
newFolderToolTipText=
UIManager.getString("FileChooser.newFolderToolTipText", l);
newFolderAccessibleName=
UIManager.getString("FileChooser.newFolderAccessibleName", l);
listViewButtonToolTipText=
UIManager.getString("FileChooser.listViewButtonToolTipText", l);
listViewButtonAccessibleName=
UIManager.getString("FileChooser.listViewButtonAccessibleName", l);
detailsViewButtonToolTipText=
UIManager.getString("FileChooser.detailsViewButtonToolTipText", l);
detailsViewButtonAccessibleName=
UIManager.getString("FileChooser.detailsViewButtonAccessibleName", l);
fileNameHeaderText=
UIManager.getString("FileChooser.fileNameHeaderText", l);
fileSizeHeaderText=
UIManager.getString("FileChooser.fileSizeHeaderText", l);
fileTypeHeaderText=
UIManager.getString("FileChooser.fileTypeHeaderText", l);
fileDateHeaderText=
UIManager.getString("FileChooser.fileDateHeaderText", l);
fileAttrHeaderText=
UIManager.getString("FileChooser.fileAttrHeaderText", l);
}
protected void installListeners(JFileChooser fc)
{
super.installListeners(fc);
ActionMap actionMap= getMyActionMap();
SwingUtilities.replaceUIActionMap(fc, actionMap);
}
protected ActionMap getMyActionMap()
{
return createMyActionMap();
}
protected ActionMap createMyActionMap()
{
AbstractAction escAction= new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
if (editing)
{
cancelEdit();
}
else
{
getFileChooser().cancelSelection();
}
}
public boolean isEnabled()
{
return getFileChooser().isEnabled();
}
};
ActionMap map= new ActionMapUIResource();
map.put("approveSelection", getApproveSelectionAction());
map.put("cancelSelection", escAction);
map.put("Go Up", getChangeToParentDirectoryAction());
return map;
}
protected JPanel createList(JFileChooser fc)
{
JPanel p= new JPanel(new BorderLayout());
final JFileChooser fileChooser= fc;
list= new JList()
{
public int getNextMatch(
String prefix,
int startIndex,
Position.Bias bias)
{
ListModel model= getModel();
int max= model.getSize();
if (prefix == null || startIndex < 0 || startIndex >= max)
{
throw new IllegalArgumentException();
}
// start search from the next element before/after the selected element
boolean backwards= (bias == Position.Bias.Backward);
for (int i= startIndex;
backwards ? i >= 0 : i < max;
i += (backwards ? -1 : 1))
{
String filename=
fileChooser.getName((File) model.getElementAt(i));
if (filename.regionMatches(true, 0, prefix, 0, prefix.length()))
{
return i;
}
}
return -1;
}
};
list.setCellRenderer(new FileRenderer());
list.setLayoutOrientation(JList.VERTICAL_WRAP);
list.setVisibleRowCount(-1);
if (fc.isMultiSelectionEnabled())
{
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
}
else
{
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
list.setModel(getModel());
list.addListSelectionListener(createListSelectionListener(fc));
list.addMouseListener(createDoubleClickListener(fc, list));
list.addMouseListener(createSingleClickListener(fc, list));
getModel().addListDataListener(new ListDataListener()
{
public void contentsChanged(ListDataEvent e)
{
// Update the selection after JList has been updated
new DelayedSelectionUpdater();
}
public void intervalAdded(ListDataEvent e)
{
new DelayedSelectionUpdater();
}
public void intervalRemoved(ListDataEvent e)
{
}
});
JScrollPane scrollpane= new JScrollPane(list);
p.add(scrollpane, BorderLayout.CENTER);
return p;
}
class DetailsTableModel
extends AbstractTableModel
implements ListDataListener
{
String[] columnNames=
{
fileNameHeaderText,
fileSizeHeaderText,
fileTypeHeaderText,
fileDateHeaderText,
fileAttrHeaderText };
JFileChooser chooser;
ListModel listModel;
DetailsTableModel(JFileChooser fc)
{
this.chooser= fc;
listModel= getModel();
listModel.addListDataListener(this);
}
public int getRowCount()
{
return listModel.getSize();
}
public int getColumnCount()
{
return COLUMN_COLCOUNT;
}
public String getColumnName(int column)
{
return columnNames[column];
}
public Class getColumnClass(int column)
{
switch (column)
{
case COLUMN_FILENAME :
return File.class;
case COLUMN_FILEDATE :
return Date.class;
default :
return super.getColumnClass(column);
}
}
public Object getValueAt(int row, int col)
{
// Note: It is very important to avoid getting info on drives, as
// this will trigger "No disk in A:" and similar dialogs.
//
// Use (f.exists() && !chooser.getFileSystemView().isFileSystemRoot(f)) to
// determine if it is safe to call methods directly on f.
File f= (File) listModel.getElementAt(row);
switch (col)
{
case COLUMN_FILENAME :
return f;
case COLUMN_FILESIZE :
if (!f.exists() || f.isDirectory())
{
return null;
}
long len= f.length() / 1024L;
if (len < 1024L)
{
return ((len == 0L) ? 1L : len) + " KB";
}
else
{
len /= 1024L;
if (len < 1024L)
{
return len + " MB";
}
else
{
len /= 1024L;
return len + " GB";
}
}
case COLUMN_FILETYPE :
if (!f.exists())
{
return null;
}
return chooser.getFileSystemView().getSystemTypeDescription(f);
case COLUMN_FILEDATE :
if (!f.exists()
|| chooser.getFileSystemView().isFileSystemRoot(f))
{
return null;
}
long time= f.lastModified();
return (time == 0L) ? null : new Date(time);
case COLUMN_FILEATTR :
if (!f.exists()
|| chooser.getFileSystemView().isFileSystemRoot(f))
{
return null;
}
String attributes= "";
if (!f.canWrite())
{
attributes += "R";
}
if (f.isHidden())
{
attributes += "H";
}
return attributes;
}
return null;
}
public void setValueAt(Object value, int row, int col)
{
if (col == COLUMN_FILENAME)
{
JFileChooser chooser= getFileChooser();
File f= (File) getValueAt(row, col);
if (f != null)
{
String oldDisplayName= chooser.getName(f);
String oldFileName= f.getName();
String newDisplayName= ((String) value).trim();
String newFileName;
if (!newDisplayName.equals(oldDisplayName))
{
newFileName= newDisplayName;
//Check if extension is hidden from user
int i1= oldFileName.length();
int i2= oldDisplayName.length();
if (i1 > i2 && oldFileName.charAt(i2) == '.')
{
newFileName= newDisplayName + oldFileName.substring(i2);
}
// rename
FileSystemView fsv= chooser.getFileSystemView();
File f2= fsv.createFileObject(f.getParentFile(), newFileName);
if (FileChooserUI.this.getModel().renameFile(f, f2))
{
if (fsv.isParent(chooser.getCurrentDirectory(), f2))
{
if (chooser.isMultiSelectionEnabled())
{
chooser.setSelectedFiles(new File[] { f2 });
}
else
{
chooser.setSelectedFile(f2);
}
}
else
{
//Could be because of delay in updating Desktop folder
//chooser.setSelectedFile(null);
}
}
else
{
// PENDING(jeff) - show a dialog indicating failure
}
}
}
}
}
public boolean isCellEditable(int row, int column)
{
return (column == COLUMN_FILENAME);
}
public void contentsChanged(ListDataEvent e)
{
fireTableDataChanged();
}
public void intervalAdded(ListDataEvent e)
{
fireTableDataChanged();
}
public void intervalRemoved(ListDataEvent e)
{
fireTableDataChanged();
}
}
class DetailsTableCellRenderer extends DefaultTableCellRenderer
{
JFileChooser chooser;
DateFormat df;
DetailsTableCellRenderer(JFileChooser chooser)
{
this.chooser= chooser;
df=
DateFormat.getDateTimeInstance(
DateFormat.SHORT,
DateFormat.SHORT,
chooser.getLocale());
}
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
if (column == COLUMN_FILESIZE || column == COLUMN_FILEATTR)
{
setHorizontalAlignment(SwingConstants.TRAILING);
}
else
{
setHorizontalAlignment(SwingConstants.LEADING);
}
return super.getTableCellRendererComponent(
table,
value,
isSelected,
hasFocus,
row,
column);
}
public void setValue(Object value)
{
setIcon(null);
if (value instanceof File)
{
File file= (File) value;
String fileName= chooser.getName(file);
setText(fileName);
Icon icon= FileChooserUI.getIcon(file, fileIcon, getFileChooser().getFileSystemView());
setIcon(icon);
}
else if (value instanceof Date)
{
setText((value == null) ? "" : df.format((Date) value));
}
else
{
super.setValue(value);
}
}
}
protected JPanel createDetailsView(JFileChooser fc)
{
final JFileChooser chooser= fc;
JPanel p= new JPanel(new BorderLayout());
DetailsTableModel detailsTableModel= new DetailsTableModel(chooser);
detailsTable= new JTable(detailsTableModel)
{
// Handle Escape key events here
protected boolean processKeyBinding(
KeyStroke ks,
KeyEvent e,
int condition,
boolean pressed)
{
if (e.getKeyCode() == KeyEvent.VK_ESCAPE
&& getCellEditor() == null)
{
// We are not editing, forward to filechooser.
chooser.dispatchEvent(e);
return true;
}
return super.processKeyBinding(ks, e, condition, pressed);
}
};
detailsTable.setComponentOrientation(chooser.getComponentOrientation());
detailsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
detailsTable.setShowGrid(false);
detailsTable.setSelectionModel(listSelectionModel);
detailsTable.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
TableColumnModel columnModel= detailsTable.getColumnModel();
TableColumn[] columns= new TableColumn[COLUMN_COLCOUNT];
for (int i= 0; i < COLUMN_COLCOUNT; i++)
{
columns[i]= columnModel.getColumn(i);
columns[i].setPreferredWidth(COLUMN_WIDTHS[i]);
}
if (!System.getProperty("os.name").startsWith("Windows"))
{
columnModel.removeColumn(columns[COLUMN_FILETYPE]);
columnModel.removeColumn(columns[COLUMN_FILEATTR]);
}
TableCellRenderer cellRenderer= new DetailsTableCellRenderer(chooser);
detailsTable.setDefaultRenderer(File.class, cellRenderer);
detailsTable.setDefaultRenderer(Date.class, cellRenderer);
detailsTable.setDefaultRenderer(Object.class, cellRenderer);
// Install cell editor for editing file name
final JTextField tf= new JTextField();
tf.addFocusListener(editorFocusListener);
columns[COLUMN_FILENAME].setCellEditor(new DefaultCellEditor(tf)
{
private long lastClick=0L;
public boolean isCellEditable(EventObject e)
{
if (e instanceof MouseEvent)
{
MouseEvent me= (MouseEvent) e;
int index= detailsTable.rowAtPoint(me.getPoint());
long clickTime=System.currentTimeMillis();
if(clickTime-lastClick>750 && detailsTable.isRowSelected(index))
{
lastClick=clickTime;
return true;
}
else
{
lastClick=clickTime;
return false;
}
// return (
//me.getClickCount() == 1 /*&& detailsTable.isRowSelected(index)*/);
}
return super.isCellEditable(e);
}
public Component getTableCellEditorComponent(
JTable table,
Object value,
boolean isSelected,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -