⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xpfilechooserui.java

📁 Swing Windows XP 外观和感觉 BeanSoft 修改版, 2003年 原始的作者: XP 外观和感觉 by Stefan Krause - http://www.stefan
💻 JAVA
📖 第 1 页 / 共 5 页
字号:

		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]);
		}

		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) {
			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");

		// Adjust width of first column so the table fills the viewport when
		// first displayed (temporary listener).
		scrollpane.addComponentListener(new ComponentAdapter() {
			public void componentResized(ComponentEvent e) {
				JScrollPane sp = (JScrollPane) e.getComponent();
				fixNameColumnWidth(sp.getViewport().getSize().width);
				sp.removeComponentListener(this);
			}
		});

		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 {
		DelayedSelectionUpdater() {
			SwingUtilities.invokeLater(this);
		}

		public void run() {
			setFileSelected();
		}
	}

	/**
	 * 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];
									if ((chooser.isFileSelectionEnabled() && f.isFile())
										|| (chooser.isDirectorySelectionEnabled() && fsv.isFileSystem(f) && f.isDirectory())) {
										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);
			}

			editCell.requestFocus();
			editCell.selectAll();
		} else if (detailsViewPanel.isVisible()) {
			detailsTable.editCellAt(index, COLUMN_FILENAME);
		}
	}

	protected class SingleClickListener extends MouseAdapter {
		JList list;

		public SingleClickListener(JList list) {
			this.list = list;
		}

		public void mouseClicked(MouseEvent e) {
			if (SwingUtilities.isLeftMouseButton(e)) {
				if (e.getClickCount() == 1) {
					JFileChooser fc = getFileChooser();
					int index = list.locationToIndex(e.getPoint());
					if ((!fc.isMultiSelectionEnabled() || fc.getSelectedFiles().length <= 1)
						&& index >= 0
						&& list.isSelectedIndex(index)
						&& getEditIndex() == index
						&& editFile == null) {

						editFileName(index);
					} else {
						if (index >= 0) {
							setEditIndex(index);
						} else {
							resetEditIndex();
						}
					}
				} else {
					// on double click (open or drill down one directory) be
					// sure to clear the edit index
					resetEditIndex();
				}
			}
		}
	}

	class EditActionListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			applyEdit();
		}
	}

	private void applyEdit() {
		if (editFile != null && editFile.exists()) {
			JFileChooser chooser = getFileChooser();
			String oldDisplayName = chooser.getName(editFile);
			String oldFileName = editFile.getName();
			String newDisplayName = editCell.getText().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(editFile.getParentFile(), newFileName);
				if (!f2.exists() && getModel().renameFile(editFile, 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
				}
			}
		}
		if (detailsTable != null && detailsTable.isEditing()) {
			detailsTable.getCellEditor().stopCellEditing();
		}
		cancelEdit();
	}

	protected class FileRenderer extends DefaultListCellRenderer {

		public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

			super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
			File file = (File) value;
			String fileName = getFileChooser().getName(file);
			setText(fileName);

			Icon icon = getFileChooser().getIcon(file);
			setIcon(icon);

			if (isSelected) {
				// PENDING(jeff) - grab padding (4) below from defaults table.
				editX = icon.getIconWidth() + 4;
			}

			return this;
		}
	}

	public void uninstallUI(JComponent c) {
		// Remove listeners

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -