windowsfilechooserui.java
来自「java jdk 1.4的源码」· Java 代码 · 共 2,088 行 · 第 1/5 页
JAVA
2,088 行
if (col == COLUMN_FILENAME) { JFileChooser chooser = getFileChooser(); File f = (File)getValueAt(row, col); 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 (!f2.exists() && WindowsFileChooserUI.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 void setBounds(int x, int y, int width, int height) { super.setBounds(x, y, Math.min(width, this.getPreferredSize().width+4), height); } 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); } if (column == COLUMN_FILENAME && table.isRowSelected(row) && table.isFocusOwner()) { super.setForeground(table.getSelectionForeground()); super.setBackground(table.getSelectionBackground()); } else { super.setForeground(table.getForeground()); super.setBackground(table.getBackground()); } setFont(table.getFont()); setValue(value); return this; } public void setValue(Object value) { setIcon(null); if (value instanceof File) { File file = (File)value; String fileName = chooser.getName(file); setText(fileName); Icon icon = chooser.getIcon(file); 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); Font font = detailsTable.getFont(); detailsTable.setRowHeight(Math.max(font.getSize(), 19)+3); 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]); } 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) { public boolean isCellEditable(EventObject e) { if (e instanceof MouseEvent) { MouseEvent me = (MouseEvent)e; int index = detailsTable.rowAtPoint(me.getPoint()); return (me.getClickCount() == 1 && detailsTable.isRowSelected(index)); } return super.isCellEditable(e); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Component comp = super.getTableCellEditorComponent(table, value, isSelected, row, column); if (value instanceof File) { tf.setText(chooser.getName((File)value)); tf.requestFocus(); tf.selectAll(); } return comp; } }); JList fakeList = new JList(detailsTableModel.listModel) { JTable table = detailsTable; public int locationToIndex(Point location) { return table.rowAtPoint(location); } public Rectangle getCellBounds(int index0, int index1) { Rectangle r0 = table.getCellRect(index0, COLUMN_FILENAME, false); Rectangle r1 = table.getCellRect(index1, COLUMN_FILENAME, false); return r0.union(r1); } public Object getSelectedValue() { return table.getValueAt(table.getSelectedRow(), COLUMN_FILENAME); } public Component add(Component comp) { if (comp instanceof JTextField) { return table.add(comp); } else { return super.add(comp); } } public void repaint() { if (table != null) table.repaint(); } public TransferHandler getTransferHandler() { if (table != null) { return table.getTransferHandler(); } else { return super.getTransferHandler(); } } public void setTransferHandler(TransferHandler newHandler) { if (table != null) { table.setTransferHandler(newHandler); } else { super.setTransferHandler(newHandler); } } public boolean getDragEnabled() { if (table != null) { return table.getDragEnabled(); } else { return super.getDragEnabled(); } } public void setDragEnabled(boolean b) { if (table != null) { table.setDragEnabled(b); } else { super.setDragEnabled(b); } } }; fakeList.setSelectionModel(listSelectionModel); detailsTable.addMouseListener(createDoubleClickListener(chooser, fakeList)); //detailsTable.addMouseListener(createSingleClickListener(chooser, fakeList)); JScrollPane scrollpane = new JScrollPane(detailsTable); scrollpane.setComponentOrientation(chooser.getComponentOrientation()); LookAndFeel.installColors(scrollpane.getViewport(), "Table.background", "Table.foreground"); scrollpane.addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent e) { JScrollPane sp = (JScrollPane)e.getComponent(); fixNameColumnWidth(sp.getViewport().getSize().width); sp.removeComponentListener(this); } }); XPStyle xp = XPStyle.getXP(); if (xp != null) { Color bg = xp.getColor("listview.fillcolor", null); if (bg != null) { list.setBackground(bg); } } if (listViewBorder != null) { scrollpane.setBorder(listViewBorder); } p.add(scrollpane, BorderLayout.CENTER); return p; } private void fixNameColumnWidth(int viewWidth) { TableColumn nameCol = detailsTable.getColumnModel().getColumn(COLUMN_FILENAME); int tableWidth = detailsTable.getPreferredSize().width; if (tableWidth < viewWidth) { nameCol.setPreferredWidth(nameCol.getPreferredWidth() + viewWidth - tableWidth); } } private class DelayedSelectionUpdater implements Runnable { File editFile; DelayedSelectionUpdater() { this(null); } DelayedSelectionUpdater(File editFile) { this.editFile = editFile; SwingUtilities.invokeLater(this); } public void run() { setFileSelected(); if (editFile != null) { editFileName(getModel().indexOf(editFile)); editFile = null; } } } /** * Creates a selection listener for the list of files and directories. * * @param fc a <code>JFileChooser</code> * @return a <code>ListSelectionListener</code> */ public ListSelectionListener createListSelectionListener(JFileChooser fc) { return new SelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { JFileChooser chooser = getFileChooser(); FileSystemView fsv = chooser.getFileSystemView(); JList list = (JList) e.getSource(); if (chooser.isMultiSelectionEnabled()) { File[] files = null; Object[] objects = list.getSelectedValues(); if (objects != null) { if (objects.length == 1 && ((File)objects[0]).isDirectory() && chooser.isTraversable(((File)objects[0])) && (chooser.getFileSelectionMode() == chooser.FILES_ONLY || !fsv.isFileSystem(((File)objects[0])))) { setDirectorySelected(true); setDirectory(((File)objects[0])); } else { files = new File[objects.length]; int j = 0; for (int i = 0; i < objects.length; i++) { File f = (File)objects[i]; boolean isDir = f.isDirectory(); boolean isFile = ShellFolder.disableFileChooserSpeedFix() ? f.isFile() : !isDir; if ((chooser.isFileSelectionEnabled() && isFile) || (chooser.isDirectorySelectionEnabled() && fsv.isFileSystem(f) && isDir)) { files[j++] = f; } } if (j == 0) { files = null; } else if (j < objects.length) { File[] tmpFiles = new File[j]; System.arraycopy(files, 0, tmpFiles, 0, j); files = tmpFiles; } setDirectorySelected(false); } } chooser.setSelectedFiles(files); } else { File file = (File)list.getSelectedValue(); if (file != null && file.isDirectory() && chooser.isTraversable(file) && (chooser.getFileSelectionMode() == chooser.FILES_ONLY || !fsv.isFileSystem(file))) { setDirectorySelected(true); setDirectory(file); chooser.setSelectedFile(null); } else { setDirectorySelected(false); if (file != null) { chooser.setSelectedFile(file); } } } } } }; } private MouseListener createSingleClickListener(JFileChooser fc, JList list) { return new SingleClickListener(list); } int lastIndex = -1; File editFile = null; int editX = 20; private int getEditIndex() { return lastIndex; } private void setEditIndex(int i) { lastIndex = i; } private void resetEditIndex() { lastIndex = -1; } private void cancelEdit() { if (editFile != null) { editFile = null; list.remove(editCell); centerPanel.repaint(); } else if (detailsTable != null && detailsTable.isEditing()) { detailsTable.getCellEditor().cancelCellEditing(); } } JTextField editCell = null; private void editFileName(int index) { ensureIndexIsVisible(index); if (listViewPanel.isVisible()) { editFile = (File)getModel().getElementAt(index); Rectangle r = list.getCellBounds(index, index); if (editCell == null) { editCell = new JTextField(); editCell.addActionListener(new EditActionListener()); editCell.addFocusListener(editorFocusListener); editCell.setNextFocusableComponent(list); } list.add(editCell); editCell.setText(getFileChooser().getName(editFile)); if (list.getComponentOrientation().isLeftToRight()) { editCell.setBounds(editX + r.x, r.y, r.width - editX, r.height); } else { editCell.setBounds(r.x, r.y, r.width - editX, r.height);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?