📄 fileexplorer.java
字号:
parentTreeNode.explore(); } int count = jTreeDisk.getModel().getChildCount(parentTreeNode); for (int i = 0; i < count; i++) { Object oneChild = jTreeDisk.getModel().getChild(parentTreeNode, i); if (oneChild instanceof MyTreeNode) { File file = (File) ((MyTreeNode) oneChild).getUserObject(); if (file.equals(selectedSubDir)) { selectedTreeNode = (MyTreeNode) oneChild; break; } } } TreePath newPath = new TreePath(selectedTreeNode.getPath()); if (jTreeDisk.isExpanded(newPath)) { // if the new path is already expanded, just select it. jTreeDisk.setSelectionPath(newPath); jTreeDisk.scrollPathToVisible(newPath); } else { jTreeDisk.expandPath(newPath); } } /** * Expands the tree to the given path. */ private void expandPaths(JTree tree, List paths) { Iterator iter = paths.iterator(); if (!iter.hasNext()) { return; } MyTreeNode parentNode = (MyTreeNode) tree.getModel().getRoot(); if (!parentNode.isExplored()) { parentNode.explore(); } // === // For Windows "My Computer" node only. // === // Ignore the root node "My Computer", since the path for this node // is not in the path list of the expanded node. File parentFile = (File) ((MyTreeNode) parentNode).getUserObject(); if (parentFile.equals(new File(FileExplorer.MY_COMPUTER_FOLDER_PATH))) { int count = jTreeDisk.getModel().getChildCount(parentNode); boolean pathNotFound = true; for (int i = 0; i < count; i++) { Object oneChild = jTreeDisk.getModel().getChild(parentNode, i); String onePath = ((MyTreeNode) oneChild).toString(); if (onePath.equalsIgnoreCase((String) iter.next())) { parentNode = (MyTreeNode) oneChild; pathNotFound = false; break; } } } else { if (!parentFile.equals((String) iter.next())) { return; } } boolean pathNotFound = false; while (iter.hasNext() && !pathNotFound) { if (!parentNode.isExplored()) { parentNode.explore(); } String nextPath = (String) iter.next(); pathNotFound = true; int count = jTreeDisk.getModel().getChildCount(parentNode); for (int i = 0; i < count; i++) { Object oneChild = jTreeDisk.getModel().getChild(parentNode, i); String onePath = ((MyTreeNode) oneChild).toString(); if (onePath.equalsIgnoreCase(nextPath)) { parentNode = (MyTreeNode) oneChild; pathNotFound = false; break; } } } if (pathNotFound) { return; } else { selectedTreeNode = parentNode; TreePath newPath = new TreePath(selectedTreeNode.getPath()); if (jTreeDisk.isExpanded(newPath)) { // if the new path is already expanded, just select it. jTreeDisk.setSelectionPath(newPath); jTreeDisk.scrollPathToVisible(newPath); } else { jTreeDisk.expandPath(newPath); } } } /** * Explores the specified directory by expanding the right tree to it path, * and display it's subdirectories and files in the right table. */ private void exploreDirectory(File selectedDir) { // First parse the given directory path into separate path names/fields. List paths = new ArrayList(); String selectedAbsPath = selectedDir.getAbsolutePath(); int beginIndex = 0; int endIndex = selectedAbsPath.indexOf(File.separator); // For the first path name, attach the path separator. // For Windows, it should be like 'C:\', for Unix, it should be like '/'. paths.add(selectedAbsPath.substring(beginIndex, endIndex + 1)); beginIndex = endIndex + 1; endIndex = selectedAbsPath.indexOf(File.separator, beginIndex); while (endIndex != -1) { // For other path names, do not attach the path separator. paths.add(selectedAbsPath.substring(beginIndex, endIndex)); beginIndex = endIndex + 1; endIndex = selectedAbsPath.indexOf(File.separator, beginIndex); } String lastPath = selectedAbsPath.substring(beginIndex, selectedAbsPath.length()); if ((lastPath != null) && (lastPath.length() != 0)) { paths.add(lastPath); } expandPaths(jTreeDisk, paths); } /** * Updates the status info including the address text field and status bar. * * It should be called in below cases: * the selected node in the left tree changes; * click on one item in the right file table; * the current status changes from STATUS_FILEEXPLORER to "WebBrowse". */ private void updateStatusInfo() { File selectedDir = (File) selectedTreeNode.getUserObject(); if (selectedDir.equals(new File(FileExplorer.MY_COMPUTER_FOLDER_PATH))) { // === // For Windows "My Computer" node only. // === if (selectedFile == null) { jAddressTextField.setText(""); statusBar.lblObject.setText(selectedTreeNode.getChildrenCount() + " object(s)"); } else { jAddressTextField.setText(selectedFile.getPath()); statusBar.lblObject.setText("1 object(s) selected"); } statusBar.lblSize.setText("0 Bytes"); } else { if (selectedFile == null) { jAddressTextField.setText(selectedDir.getPath()); statusBar.lblObject.setText(selectedTreeNode.getChildrenCount() + " object(s)"); statusBar.lblSize.setText(MyUtility.length2KB(selectedTreeNode.getSize())); } else { jAddressTextField.setText(selectedFile.getPath()); statusBar.lblObject.setText("1 object(s) selected"); statusBar.lblSize.setText(MyUtility.length2KB(selectedFile.length())); } } } void jTable_maybePopUpMenu(MouseEvent e) { if (e.isPopupTrigger() == false || selectedFile == null) { return; } if (!selectedFile.isDirectory()) { // For a selected file, all the menu items are visible. // Check the availability of the menu items. jDesktopPopupMenu.removeAll(); jDesktopPopupMenu.add(jMenuItemOpen); jDesktopPopupMenu.add(jMenuItemEdit); jDesktopPopupMenu.add(jMenuItemPrint); jDesktopPopupMenu.addSeparator(); jDesktopPopupMenu.add(jMenuItemBrowse); jDesktopPopupMenu.addSeparator(); jDesktopPopupMenu.add(jMenuItemMail); if (Desktop.isEditable(selectedFile)) { jMenuItemEdit.setEnabled(true); } else { jMenuItemEdit.setEnabled(false); } if (Desktop.isPrintable(selectedFile)) { jMenuItemPrint.setEnabled(true); } else { jMenuItemPrint.setEnabled(false); } jDesktopPopupMenu.show((Component) jTable, e.getX(), e.getY()); } else { // For a selected directory, only "Open", "Browse" and "Browser in New // Window" items are visible. jDesktopPopupMenu.removeAll(); jDesktopPopupMenu.add(jMenuItemOpen); jDesktopPopupMenu.addSeparator(); jDesktopPopupMenu.add(jMenuItemBrowse); jDesktopPopupMenu.show((Component) jTable, e.getX(), e.getY()); } } void jTable_mouseClicked(MouseEvent e) { int curRow = jTable.rowAtPoint(new Point(e.getX(), e.getY())); if (curRow == -1) { selectedFile = null; updateStatusInfo(); jTable.clearSelection(); return; } if (SwingUtilities.isRightMouseButton(e)) { // Enable right click selection. Left click selection is auto-enabled, // and doesn't need to be enabled specifically. curRow = jTable.rowAtPoint(new Point(e.getX(), e.getY())); jTable.clearSelection(); jTable.addRowSelectionInterval(curRow, curRow); } ListSelectionModel lsm = jTable.getSelectionModel(); int selectedRow = lsm.getMinSelectionIndex(); DiskObject selectedObject = (DiskObject) tableModel.getValueAt(selectedRow, 0); File selectedDir = (File) selectedTreeNode.getUserObject(); if (selectedDir.equals(new File(FileExplorer.MY_COMPUTER_FOLDER_PATH))) { // === // For Windows "My Computer" node only. // === selectedFile = new File(selectedObject.name); } else { selectedFile = new File(selectedDir.toString() + File.separator + selectedObject.name); } // Update the address text field and status bar. updateStatusInfo(); if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) { // For a left and double click, open the file or directory. // Notice!!!. Below code is duplicate of // void jMenuItemOpen_actionPerformed(ActionEvent e) {} // Popup the context menu. if (!selectedFile.isDirectory()) { try { Desktop.open(selectedFile); } catch (DesktopException de) { JOptionPane.showMessageDialog(this, de.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } else { // The selection is a directory, open it. exploreDirectory(selectedTreeNode, selectedFile); } } } void jMenuItemOpen_actionPerformed(ActionEvent e) { if (!selectedFile.isDirectory()) { try { Desktop.open(selectedFile); } catch (DesktopException de) { JOptionPane.showMessageDialog(this, de.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } else { // The selection is a directory, open it. exploreDirectory(selectedTreeNode, selectedFile); } } void jMenuItemEdit_actionPerformed(ActionEvent e) { try { Desktop.edit(selectedFile); } catch (DesktopException de) { JOptionPane.showMessageDialog(this, de.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } void jMenuItemPrint_actionPerformed(ActionEvent e) { try { Desktop.print(selectedFile); } catch (DesktopException de) { JOptionPane.showMessageDialog(this, de.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } void jMenuItemBrowse_actionPerformed(ActionEvent e) { URL fileURL = null; try { fileURL = selectedFile.toURL(); } catch (MalformedURLException mue) { JOptionPane.showMessageDialog(this, mue.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } try { Desktop.browse(fileURL); } catch (DesktopException de) { JOptionPane.showMessageDialog(this, de.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -