Файл GUI браузера


FileBro - основной графический интерфейс файлового браузера.

Функциональность FileBro

  • Дерево каталогов - показывает файл корней системы при пуске, но в остальном причине лениво, как пользователь переходит по файловой системе. FileBro отображает прогресс-бар загрузки новых записей.
  • Список файлов (таблица) отображает список файлов и директорий в текущей выборке дерева каталогов. Отсортировать, щелкнув на заголовке столбца.
  • Кнопки - вся польза рабочего класса для своей функциональности. Если действие не может быть завершено, значимые причины должны отображаться в JEditorPane сообщение об ошибке.
    • Найти - открывает родительский каталог текущего выбранного файла.
    • Открыть - запускает любые приложения по умолчанию потребителей для этого типа файла.
    • Редактировать - открывает файл для редактирования по умолчанию потребителей.
    • Печать - печать файла с помощью стандартных потребителей.
  • Подробные сведения о выбранный файл отображается под кнопками.

Делает текущей функциональности работать в соответствии с выше описание?

FileBrowser.java

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Container;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.*;
import java.awt.image.*;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import javax.swing.table.*;
import javax.swing.filechooser.FileSystemView;

import javax.imageio.ImageIO;

import java.util.Date;
import java.util.List;
import java.util.ArrayList;

import java.io.*;
import java.nio.channels.FileChannel;

import java.net.URL;

/**
A basic File Browser.  Requires 1.6+ for the Desktop & SwingWorker
classes, amongst other minor things.

Includes support classes FileTableModel & FileTreeCellRenderer.

@TODO Bugs
<li>Fix keyboard focus issues - especially when functions like
rename/delete etc. are called that update nodes & file lists.
<li>Needs more testing in general.

@TODO Functionality
<li>Double clicking a directory in the table, should update the tree
<li>Move progress bar?
<li>Add other file display modes (besides table) in CardLayout?
<li>Menus + other cruft?
<li>Implement history/back
<li>Allow multiple selection
<li>Add file search

@author Andrew Thompson
@version 2011-06-08
@see http://codereview.stackexchange.com/q/4446/7784
@license LGPL
*/
class FileBrowser {

    /** Title of the application */
    public static final String APP_TITLE = "FileBro";
    /** Used to open/edit/print files. */
    private Desktop desktop;
    /** Provides nice icons and names for files. */
    private FileSystemView fileSystemView;

    /** currently selected File. */
    private File currentFile;

    /** Main GUI container */
    private JPanel gui;

    /** File-system tree. Built Lazily */
    private JTree tree;
    private DefaultTreeModel treeModel;

    /** Directory listing */
    private JTable table;
    private JProgressBar progressBar;
    /** Table model for File[]. */
    private FileTableModel fileTableModel;
    private ListSelectionListener listSelectionListener;
    private boolean cellSizesSet = false;
    private int rowIconPadding = 6;

    /* File controls. */
    private JButton openFile;
    private JButton printFile;
    private JButton editFile;

    /* File details. */
    private JLabel fileName;
    private JTextField path;
    private JLabel date;
    private JLabel size;
    private JCheckBox readable;
    private JCheckBox writable;
    private JCheckBox executable;
    private JRadioButton isDirectory;
    private JRadioButton isFile;

    /* GUI options/containers for new File/Directory creation.  Created lazily. */
    private JPanel newFilePanel;
    private JRadioButton newTypeFile;
    private JTextField name;

    public Container getGui() {
        if (gui==null) {
            gui = new JPanel(new BorderLayout(3,3));
            gui.setBorder(new EmptyBorder(5,5,5,5));

            fileSystemView = FileSystemView.getFileSystemView();
            desktop = Desktop.getDesktop();

            JPanel detailView = new JPanel(new BorderLayout(3,3));

            table = new JTable();
            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            table.setAutoCreateRowSorter(true);
            table.setShowVerticalLines(false);

            listSelectionListener = new ListSelectionListener() {
                @Override
                public void valueChanged(ListSelectionEvent lse) {
                    int row = table.getSelectionModel().getLeadSelectionIndex();
                    setFileDetails( ((FileTableModel)table.getModel()).getFile(row) );
                }
            };
            table.getSelectionModel().addListSelectionListener(listSelectionListener);
            JScrollPane tableScroll = new JScrollPane(table);
            Dimension d = tableScroll.getPreferredSize();
            tableScroll.setPreferredSize(new Dimension((int)d.getWidth(), (int)d.getHeight()/2));
            detailView.add(tableScroll, BorderLayout.CENTER);

            // the File tree
            DefaultMutableTreeNode root = new DefaultMutableTreeNode();
            treeModel = new DefaultTreeModel(root);

            TreeSelectionListener treeSelectionListener = new TreeSelectionListener() {
                public void valueChanged(TreeSelectionEvent tse){
                    DefaultMutableTreeNode node =
                        (DefaultMutableTreeNode)tse.getPath().getLastPathComponent();
                    showChildren(node);
                    setFileDetails((File)node.getUserObject());
                }
            };

            // show the file system roots.
            File[] roots = fileSystemView.getRoots();
            for (File fileSystemRoot : roots) {
                DefaultMutableTreeNode node = new DefaultMutableTreeNode(fileSystemRoot);
                root.add( node );
                File[] files = fileSystemView.getFiles(fileSystemRoot, true);
                for (File file : files) {
                    if (file.isDirectory()) {
                        node.add(new DefaultMutableTreeNode(file));
                    }
                }
                //
            }

            tree = new JTree(treeModel);
            tree.setRootVisible(false);
            tree.addTreeSelectionListener(treeSelectionListener);
            tree.setCellRenderer(new FileTreeCellRenderer());
            tree.expandRow(0);
            JScrollPane treeScroll = new JScrollPane(tree);

            // as per trashgod tip
            tree.setVisibleRowCount(15);

            Dimension preferredSize = treeScroll.getPreferredSize();
            Dimension widePreferred = new Dimension(
                200,
                (int)preferredSize.getHeight());
            treeScroll.setPreferredSize( widePreferred );

            // details for a File
            JPanel fileMainDetails = new JPanel(new BorderLayout(4,2));
            fileMainDetails.setBorder(new EmptyBorder(0,6,0,6));

            JPanel fileDetailsLabels = new JPanel(new GridLayout(0,1,2,2));
            fileMainDetails.add(fileDetailsLabels, BorderLayout.WEST);

            JPanel fileDetailsValues = new JPanel(new GridLayout(0,1,2,2));
            fileMainDetails.add(fileDetailsValues, BorderLayout.CENTER);

            fileDetailsLabels.add(new JLabel("File", JLabel.TRAILING));
            fileName = new JLabel();
            fileDetailsValues.add(fileName);
            fileDetailsLabels.add(new JLabel("Path/name", JLabel.TRAILING));
            path = new JTextField(5);
            path.setEditable(false);
            fileDetailsValues.add(path);
            fileDetailsLabels.add(new JLabel("Last Modified", JLabel.TRAILING));
            date = new JLabel();
            fileDetailsValues.add(date);
            fileDetailsLabels.add(new JLabel("File size", JLabel.TRAILING));
            size = new JLabel();
            fileDetailsValues.add(size);
            fileDetailsLabels.add(new JLabel("Type", JLabel.TRAILING));

            JPanel flags = new JPanel(new FlowLayout(FlowLayout.LEADING,4,0));

            isDirectory = new JRadioButton("Directory");
            flags.add(isDirectory);

            isFile = new JRadioButton("File");
            flags.add(isFile);
            fileDetailsValues.add(flags);

            JToolBar toolBar = new JToolBar();
            // mnemonics stop working in a floated toolbar
            toolBar.setFloatable(false);

            JButton locateFile = new JButton("Locate");
            locateFile.setMnemonic('l');

            locateFile.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae) {
                    try {
                        System.out.println("Locate: " + currentFile.getParentFile());
                        desktop.open(currentFile.getParentFile());
                    } catch(Throwable t) {
                        showThrowable(t);
                    }
                    gui.repaint();
                }
            });
            toolBar.add(locateFile);

            openFile = new JButton("Open");
            openFile.setMnemonic('o');

            openFile.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae) {
                    try {
                        System.out.println("Open: " + currentFile);
                        desktop.open(currentFile);
                    } catch(Throwable t) {
                        showThrowable(t);
                    }
                    gui.repaint();
                }
            });
            toolBar.add(openFile);

            editFile = new JButton("Edit");
            editFile.setMnemonic('e');
            editFile.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae) {
                    try {
                        desktop.edit(currentFile);
                    } catch(Throwable t) {
                        showThrowable(t);
                    }
                }
            });
            toolBar.add(editFile);

            printFile = new JButton("Print");
            printFile.setMnemonic('p');
            printFile.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae) {
                    try {
                        desktop.print(currentFile);
                    } catch(Throwable t) {
                        showThrowable(t);
                    }
                }
            });
            toolBar.add(printFile);

            // Check the actions are supported on this platform!
            openFile.setEnabled(desktop.isSupported(Desktop.Action.OPEN));
            editFile.setEnabled(desktop.isSupported(Desktop.Action.EDIT));
            printFile.setEnabled(desktop.isSupported(Desktop.Action.PRINT));

            flags.add(new JLabel("::  Flags"));
            readable = new JCheckBox("Read  ");
            readable.setMnemonic('a');
            flags.add(readable);

            writable = new JCheckBox("Write  ");
            writable.setMnemonic('w');
            flags.add(writable);

            executable = new JCheckBox("Execute");
            executable.setMnemonic('x');
            flags.add(executable);

            int count = fileDetailsLabels.getComponentCount();
            for (int ii=0; ii<count; ii++) {
                fileDetailsLabels.getComponent(ii).setEnabled(false);
            }

            count = flags.getComponentCount();
            for (int ii=0; ii<count; ii++) {
                flags.getComponent(ii).setEnabled(false);
            }

            JPanel fileView = new JPanel(new BorderLayout(3,3));

            fileView.add(toolBar,BorderLayout.NORTH);
            fileView.add(fileMainDetails,BorderLayout.CENTER);

            detailView.add(fileView, BorderLayout.SOUTH);

            JSplitPane splitPane = new JSplitPane(
                JSplitPane.HORIZONTAL_SPLIT,
                treeScroll,
                detailView);
            gui.add(splitPane, BorderLayout.CENTER);

            JPanel simpleOutput = new JPanel(new BorderLayout(3,3));
            progressBar = new JProgressBar();
            simpleOutput.add(progressBar, BorderLayout.EAST);
            progressBar.setVisible(false);

            gui.add(simpleOutput, BorderLayout.SOUTH);

        }
        return gui;
    }

    public void showRootFile() {
        // ensure the main files are displayed
        tree.setSelectionInterval(0,0);
    }

    private TreePath findTreePath(File find) {
        for (int ii=0; ii<tree.getRowCount(); ii++) {
            TreePath treePath = tree.getPathForRow(ii);
            Object object = treePath.getLastPathComponent();
            DefaultMutableTreeNode node = (DefaultMutableTreeNode)object;
            File nodeFile = (File)node.getUserObject();

            if (nodeFile==find) {
                return treePath;
            }
        }
        // not found!
        return null;
    }

    private void showErrorMessage(String errorMessage, String errorTitle) {
        JOptionPane.showMessageDialog(
            gui,
            errorMessage,
            errorTitle,
            JOptionPane.ERROR_MESSAGE
            );
    }

    private void showThrowable(Throwable t) {
        t.printStackTrace();
        JOptionPane.showMessageDialog(
            gui,
            t.toString(),
            t.getMessage(),
            JOptionPane.ERROR_MESSAGE
            );
        gui.repaint();
    }

    /** Update the table on the EDT */
    private void setTableData(final File[] files) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                if (fileTableModel==null) {
                    fileTableModel = new FileTableModel();
                    table.setModel(fileTableModel);
                }
                table.getSelectionModel().removeListSelectionListener(listSelectionListener);
                fileTableModel.setFiles(files);
                table.getSelectionModel().addListSelectionListener(listSelectionListener);
                if (!cellSizesSet) {
                    Icon icon = fileSystemView.getSystemIcon(files[0]);

                    // size adjustment to better account for icons
                    table.setRowHeight( icon.getIconHeight()+rowIconPadding );

                    setColumnWidth(0,-1);
                    setColumnWidth(3,60);
                    table.getColumnModel().getColumn(3).setMaxWidth(120);
                    setColumnWidth(4,-1);
                    setColumnWidth(5,-1);
                    setColumnWidth(6,-1);
                    setColumnWidth(7,-1);
                    setColumnWidth(8,-1);
                    setColumnWidth(9,-1);

                    cellSizesSet = true;
                }
            }
        });
    }

    private void setColumnWidth(int column, int width) {
        TableColumn tableColumn = table.getColumnModel().getColumn(column);
        if (width<0) {
            // use the preferred width of the header..
            JLabel label = new JLabel( (String)tableColumn.getHeaderValue() );
            Dimension preferred = label.getPreferredSize();
            // altered 10->14 as per camickr comment.
            width = (int)preferred.getWidth()+14;
        }
        tableColumn.setPreferredWidth(width);
        tableColumn.setMaxWidth(width);
        tableColumn.setMinWidth(width);
    }

    /** Add the files that are contained within the directory of this node.
    Thanks to Hovercraft Full Of Eels for the SwingWorker fix. */
    private void showChildren(final DefaultMutableTreeNode node) {
        tree.setEnabled(false);
        progressBar.setVisible(true);
        progressBar.setIndeterminate(true);

        SwingWorker<Void, File> worker = new SwingWorker<Void, File>() {
            @Override
            public Void doInBackground() {
                File file = (File) node.getUserObject();
                if (file.isDirectory()) {
                    File[] files = fileSystemView.getFiles(file, true); //!!
                    if (node.isLeaf()) {
                        for (File child : files) {
                            if (child.isDirectory()) {
                                publish(child);
                            }
                        }
                    }
                    setTableData(files);
                }
                return null;
            }

            @Override
            protected void process(List<File> chunks) {
                for (File child : chunks) {
                    node.add(new DefaultMutableTreeNode(child));
                }
            }

            @Override
            protected void done() {
                progressBar.setIndeterminate(false);
                progressBar.setVisible(false);
                tree.setEnabled(true);
            }
        };
        worker.execute();
    }

    /** Update the File details view with the details of this File. */
    private void setFileDetails(File file) {
        currentFile = file;
        Icon icon = fileSystemView.getSystemIcon(file);
        fileName.setIcon(icon);
        fileName.setText(fileSystemView.getSystemDisplayName(file));
        path.setText(file.getPath());
        date.setText(new Date(file.lastModified()).toString());
        size.setText(file.length() + " bytes");
        readable.setSelected(file.canRead());
        writable.setSelected(file.canWrite());
        executable.setSelected(file.canExecute());
        isDirectory.setSelected(file.isDirectory());

        isFile.setSelected(file.isFile());

        JFrame f = (JFrame)gui.getTopLevelAncestor();
        if (f!=null) {
            f.setTitle(
                APP_TITLE +
                " :: " +
                fileSystemView.getSystemDisplayName(file) );
        }

        gui.repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    // Significantly improves the look of the output in
                    // terms of the file names returned by FileSystemView!
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch(Exception weTried) {
                }
                JFrame f = new JFrame(APP_TITLE);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                FileBrowser FileBrowser = new FileBrowser();
                f.setContentPane(FileBrowser.getGui());

                try {
                    URL urlBig = FileBrowser.getClass().getResource("fb-icon-32x32.png");
                    URL urlSmall = FileBrowser.getClass().getResource("fb-icon-16x16.png");
                    ArrayList<Image> images = new ArrayList<Image>();
                    images.add( ImageIO.read(urlBig) );
                    images.add( ImageIO.read(urlSmall) );
                    f.setIconImages(images);
                } catch(Exception weTried) {}

                f.pack();
                f.setLocationByPlatform(true);
                f.setMinimumSize(f.getSize());
                f.setVisible(true);

                FileBrowser.showRootFile();
            }
        });
    }
}

/** A TableModel to hold File[]. */
class FileTableModel extends AbstractTableModel {

    private File[] files;
    private FileSystemView fileSystemView = FileSystemView.getFileSystemView();
    private String[] columns = {
        "Icon",
        "File",
        "Path/name",
        "Size",
        "Last Modified",
        "R",
        "W",
        "E",
        "D",
        "F",
    };

    FileTableModel() {
        this(new File[0]);
    }

    FileTableModel(File[] files) {
        this.files = files;
    }

    public Object getValueAt(int row, int column) {
        File file = files[row];
        switch (column) {
            case 0:
                return fileSystemView.getSystemIcon(file);
            case 1:
                return fileSystemView.getSystemDisplayName(file);
            case 2:
                return file.getPath();
            case 3:
                return file.length();
            case 4:
                return file.lastModified();
            case 5:
                return file.canRead();
            case 6:
                return file.canWrite();
            case 7:
                return file.canExecute();
            case 8:
                return file.isDirectory();
            case 9:
                return file.isFile();
            default:
                System.err.println("Logic Error");
        }
        return "";
    }

    public int getColumnCount() {
        return columns.length;
    }

    public Class<?> getColumnClass(int column) {
        switch (column) {
            case 0:
                return ImageIcon.class;
            case 3:
                return Long.class;
            case 4:
                return Date.class;
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
                return Boolean.class;
        }
        return String.class;
    }

    public String getColumnName(int column) {
        return columns[column];
    }

    public int getRowCount() {
        return files.length;
    }

    public File getFile(int row) {
        return files[row];
    }

    public void setFiles(File[] files) {
        this.files = files;
        fireTableDataChanged();
    }
}

/** A TreeCellRenderer for a File. */
class FileTreeCellRenderer extends DefaultTreeCellRenderer {

    private FileSystemView fileSystemView;

    private JLabel label;

    FileTreeCellRenderer() {
        label = new JLabel();
        label.setOpaque(true);
        fileSystemView = FileSystemView.getFileSystemView();
    }

    @Override
    public Component getTreeCellRendererComponent(
        JTree tree,
        Object value,
        boolean selected,
        boolean expanded,
        boolean leaf,
        int row,
        boolean hasFocus) {

        DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
        File file = (File)node.getUserObject();
        label.setIcon(fileSystemView.getSystemIcon(file));
        label.setText(fileSystemView.getSystemDisplayName(file));
        label.setToolTipText(file.getPath());

        if (selected) {
            label.setBackground(backgroundSelectionColor);
            label.setForeground(textSelectionColor);
        } else {
            label.setBackground(backgroundNonSelectionColor);
            label.setForeground(textNonSelectionColor);
        }

        return label;
    }
}

В FileBrowser.java исходного кода составляет около 650 линий.

Также

  • Вот 2 иконки для приложения. (но он будет работать нормально без них). Они будут использоваться если в той же директории, как классы. Иконки использовать цвет.Белый представлять невыбранных строк таблицы & дерево узлов, так что те невидимые в веб-страницу с белым фоном. ;)
    1. ФБ-иконки-16х16.ПНГ fm-icon-16x16.png
    2. ФБ-иконки-32х32.ПНГ fm-icon-32x32.png
  • Любые другие комментарии/советы/предложения приветствуются.


54732
84
задан 31 мая 2011 в 01:05 Источник Поделиться
Комментарии
6 ответов

Этот код касается меня:

  SwingWorker worker = new SwingWorker() {
@Override
public String doInBackground() {
tree.setEnabled(false);
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
File file = (File) node.getUserObject();
if (file.isDirectory()) {
File[] files = fileSystemView.getFiles(file, true);
if (node.isLeaf()) {
for (File child : files) {
if (child.isDirectory()) {
node.add(new DefaultMutableTreeNode(child));
}
}
}
setTableData(files);
}
progressBar.setIndeterminate(false);
progressBar.setVisible(false);
tree.setEnabled(true);
return "done";
}
};
worker.execute();

как вы делаете качели звонков на JProgressBar с ЭДТ. Лучше начать прогресс-бар до SwingWorker и закончить его в метод done. Либо так, либо добавить PropertyChangeListener к SwingWorker и конец индикатор, когда государственная собственность работника StateValue.Сделано.

Другой вопрос, что вы используете DefaultMutableTreeNode, и в этот API, многопоточность необходимо соблюдать осторожность при использовании этого, так как вы, по-видимому, с помощью этого более чем в один поток:


Это не безопасная класса Thread.Если вы намерены использовать DefaultMutableTreeNode (или дерево TreeNodes) в более чем один поток, вы должны сделать свой собственный синхронизации. Хорошее конвенции синхронизации на корневой узел дерева.

Редактировать
Один из способов , возможно, Вам DefaultMutableTreeNode, по крайней мере, из уравнения, чтобы добавить узлы к ней в одном потоке, только в ЕДТ, с помощью SwingWorker публикации/процесс. Например:

   private void showChildren(final DefaultMutableTreeNode node) {
tree.setEnabled(false);
progressBar.setVisible(true);
progressBar.setIndeterminate(true);

SwingWorker<Void, File> worker = new SwingWorker<Void, File>() {
@Override
public Void doInBackground() {
File file = (File) node.getUserObject();
if (file.isDirectory()) {
File[] files = fileSystemView.getFiles(file, true); //!!
if (node.isLeaf()) {
for (File child : files) {
if (child.isDirectory()) {
publish(child);
}
}
}
setTableData(files);
}
return null;
}

@Override
protected void process(List<File> chunks) {
for (File child : chunks) {
node.add(new DefaultMutableTreeNode(child));
}
}

@Override
protected void done() {
progressBar.setIndeterminate(false);
progressBar.setVisible(false);
tree.setEnabled(true);
}
};
worker.execute();
}

36
ответ дан 31 мая 2011 в 02:05 Источник Поделиться

Mac ОС X 10.5 и Ubuntu 10.04: повторные нефатальные NPE на удаление.

Дополнение: в строке 441, findTreePath() всегда возвращает значение null, потому что currentFile.getParentFile() возвращает путь к файлу, а не сам файл. По сути, путь не сам матч. Я не вижу очевидного решения.

Добавление: я не могу найти приемлемого решения. Я подозреваю, что проблема вращается вокруг дихотомии между видом (jtree из) и модель (DefaultTreeModel). В частности, findTreePath() - это поиск среди видимых строк, а не узлы дерева модели. Она может оказаться полезной для реализации TreeModel явно, как показано в этом FileTreeModel. Это может также помочь в абстрактной модели представления, методов преобразования, аналогичные тем, обеспечивается jtable, выполните следующие действия.

В качестве альтернативного подхода, рассмотреть орг.в NetBeans.качели.контур.Контур, изображенный ниже. Он принимает FileTreeModel, упомянутых ранее. Расширяя таблица jtable, он использует привычные средства визуализации и редактор схемы через удобный RowModel интерфейс, похожий на TableModel. Самое главное, что он обеспечивает отображает(), а также отображает(). В jtable, выполните следующие действия метода getValueAt() переопределяется для вызова отображает(), делая выбор слушателя в этом примере просто. Банку независима, небольшой (~230 КБ) и стабильный; он может быть найден в распределение в NetBeans:


NetBeans/platform/modules/org-netbeans-swing-outline.jar

outline view

Добавление: файловый браузер версия 2011-06-08 работает корректно на обеих системах привел выше.


currentFile: /temp.txt
parentPath: нуль
Ява.яз.Исключение NullPointerException
в Файлменеджером.это(файлменеджер.Ява:443)
в Файлменеджером.доступ к 1000$(файлменеджер.Ява:56)
в Файлменеджером$9.событий actionperformed(файлменеджер.на Java:306)
в пакете javax.качели.AbstractButton.fireActionPerformed(AbstractButton.Ява:2028)
в пакете javax.качели.AbstractButton$Обработчик.событий actionperformed(AbstractButton.на Java:2351)
в пакете javax.качели.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.Ява:387)
в пакете javax.качели.DefaultButtonModel.setPressed(DefaultButtonModel.Ява:242)
в пакете javax.качели.plafбыл.основные.BasicButtonListener.mouseReleased(BasicButtonListener.Ява:236)
в Java.авт.Компонент.processMouseEvent(компонент.Ява:6374)
в пакете javax.качели.JComponent.processMouseEvent(JComponent.Ява:3267)
в Java.авт.Компонент.processEvent(компонент.Ява:6139)
в Java.авт.Контейнер.processEvent(контейнер.Ява:2085)
в Java.авт.Компонент.dispatchEventImpl(компонент.Ява:4736)
в Java.авт.Контейнер.dispatchEventImpl(контейнер.Ява:2143)
в Java.авт.Компонент.dispatchevent метод(компонент.Ява:4566)
в Java.авт.LightweightDispatcher.retargetMouseEvent(контейнер.Ява:4621)
в Java.авт.LightweightDispatcher.processMouseEvent(контейнер.Ява:4282)
в Java.авт.LightweightDispatcher.dispatchevent метод(контейнер.Ява:4212)
в Java.авт.Контейнер.dispatchEventImpl(контейнер.Ява:2129)
в Java.авт.Окна.dispatchEventImpl(окна.Ява:2478)
в Java.авт.Компонент.dispatchevent метод(компонент.Ява:4566)
в Java.авт.EventQueue.dispatchEventImpl(EventQueue.Ява:680)
в Java.авт.EventQueue.доступ к$000(EventQueue.Ява:86)
в Java.авт.EventQueue$1.запустить(EventQueue.Ява:639)
в Java.авт.EventQueue$1.запустить(EventQueue.Ява:637)
в Java.безопасности.AccessController.doPrivileged(родной способ)
в Java.безопасности.Accesscontrolcontext, в$1.doIntersectionPrivilege(accesscontrolcontext, в котором.Ява:87)
в Java.безопасности.Accesscontrolcontext, в$1.doIntersectionPrivilege(accesscontrolcontext, в котором.Ява:98)
в Java.авт.EventQueue$2.запустить(EventQueue.Ява:653)
в Java.авт.EventQueue$2.запустить(EventQueue.Ява:651)
в Java.безопасности.AccessController.doPrivileged(родной способ)
в Java.безопасности.Accesscontrolcontext, в$1.doIntersectionPrivilege(accesscontrolcontext, в котором.Ява:87)
в Java.авт.EventQueue.dispatchevent метод(EventQueue.Ява:650)
в Java.авт.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.Ява:296)
в Java.авт.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.Ява:211)
в Java.авт.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.Ява:201)
в Java.авт.EventDispatchThread.pumpEvents(EventDispatchThread.Ява:196)
в Java.авт.EventDispatchThread.pumpEvents(EventDispatchThread.Ява:188)
в Java.авт.EventDispatchThread.запустить(EventDispatchThread.Ява:122)

20
ответ дан 31 мая 2011 в 02:05 Источник Поделиться

Это последнее редактирование кода, прежде чем я решил обратиться Файлмен(Агер) в FileBro(wser) (FileBro подходит для редактирования на исходный вопрос, 'уже скоро'). Эта версия Филман размещена здесь на благо людей, которые хотят расширить этот код (очень неполное, багги) в этом направлении.

FileManager.java

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Container;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.*;
import java.awt.image.*;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import javax.swing.table.*;
import javax.swing.filechooser.FileSystemView;

import javax.imageio.ImageIO;

import java.util.Date;
import java.util.List;
import java.util.ArrayList;

import java.io.*;
import java.nio.channels.FileChannel;

import java.net.URL;

/**
A basic File Manager. Requires 1.6+ for the Desktop & SwingWorker
classes, amongst other minor things.

Includes support classes FileTableModel & FileTreeCellRenderer.

@TODO Bugs
<li>Still throws occasional AIOOBEs and NPEs, so some update on
the EDT must have been missed.
<li>Fix keyboard focus issues - especially when functions like
rename/delete etc. are called that update nodes & file lists.
<li>Needs more testing in general.

@TODO Functionality
<li>Implement Read/Write/Execute checkboxes
<li>Implement Copy
<li>Extra prompt for directory delete (camickr suggestion)
<li>Add File/Directory fields to FileTableModel
<li>Double clicking a directory in the table, should update the tree
<li>Move progress bar?
<li>Add other file display modes (besides table) in CardLayout?
<li>Menus + other cruft?
<li>Implement history/back
<li>Allow multiple selection
<li>Add file search

@author Andrew Thompson
@version 2011-06-01
@see http://stackoverflow.com/questions/6182110
@license LGPL
*/
class FileManager {

/** Title of the application */
public static final String APP_TITLE = "FileMan";
/** Used to open/edit/print files. */
private Desktop desktop;
/** Provides nice icons and names for files. */
private FileSystemView fileSystemView;

/** currently selected File. */
private File currentFile;

/** Main GUI container */
private JPanel gui;

/** File-system tree. Built Lazily */
private JTree tree;
private DefaultTreeModel treeModel;

/** Directory listing */
private JTable table;
private JProgressBar progressBar;
/** Table model for File[]. */
private FileTableModel fileTableModel;
private ListSelectionListener listSelectionListener;
private boolean cellSizesSet = false;
private int rowIconPadding = 6;

/* File controls. */
private JButton openFile;
private JButton printFile;
private JButton editFile;
private JButton deleteFile;
private JButton newFile;
private JButton copyFile;
/* File details. */
private JLabel fileName;
private JTextField path;
private JLabel date;
private JLabel size;
private JCheckBox readable;
private JCheckBox writable;
private JCheckBox executable;
private JRadioButton isDirectory;
private JRadioButton isFile;

/* GUI options/containers for new File/Directory creation. Created lazily. */
private JPanel newFilePanel;
private JRadioButton newTypeFile;
private JTextField name;

public Container getGui() {
if (gui==null) {
gui = new JPanel(new BorderLayout(3,3));
gui.setBorder(new EmptyBorder(5,5,5,5));

fileSystemView = FileSystemView.getFileSystemView();
desktop = Desktop.getDesktop();

JPanel detailView = new JPanel(new BorderLayout(3,3));
//fileTableModel = new FileTableModel();

table = new JTable();
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setAutoCreateRowSorter(true);
table.setShowVerticalLines(false);

listSelectionListener = new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent lse) {
int row = table.getSelectionModel().getLeadSelectionIndex();
setFileDetails( ((FileTableModel)table.getModel()).getFile(row) );
}
};
table.getSelectionModel().addListSelectionListener(listSelectionListener);
JScrollPane tableScroll = new JScrollPane(table);
Dimension d = tableScroll.getPreferredSize();
tableScroll.setPreferredSize(new Dimension((int)d.getWidth(), (int)d.getHeight()/2));
detailView.add(tableScroll, BorderLayout.CENTER);

// the File tree
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
treeModel = new DefaultTreeModel(root);

TreeSelectionListener treeSelectionListener = new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent tse){
DefaultMutableTreeNode node =
(DefaultMutableTreeNode)tse.getPath().getLastPathComponent();
showChildren(node);
setFileDetails((File)node.getUserObject());
}
};

// show the file system roots.
File[] roots = fileSystemView.getRoots();
for (File fileSystemRoot : roots) {
DefaultMutableTreeNode node = new DefaultMutableTreeNode(fileSystemRoot);
root.add( node );
//showChildren(node);
//
File[] files = fileSystemView.getFiles(fileSystemRoot, true);
for (File file : files) {
if (file.isDirectory()) {
node.add(new DefaultMutableTreeNode(file));
}
}
//
}

tree = new JTree(treeModel);
tree.setRootVisible(false);
tree.addTreeSelectionListener(treeSelectionListener);
tree.setCellRenderer(new FileTreeCellRenderer());
tree.expandRow(0);
JScrollPane treeScroll = new JScrollPane(tree);

// as per trashgod tip
tree.setVisibleRowCount(15);

Dimension preferredSize = treeScroll.getPreferredSize();
Dimension widePreferred = new Dimension(
200,
(int)preferredSize.getHeight());
treeScroll.setPreferredSize( widePreferred );

// details for a File
JPanel fileMainDetails = new JPanel(new BorderLayout(4,2));
fileMainDetails.setBorder(new EmptyBorder(0,6,0,6));

JPanel fileDetailsLabels = new JPanel(new GridLayout(0,1,2,2));
fileMainDetails.add(fileDetailsLabels, BorderLayout.WEST);

JPanel fileDetailsValues = new JPanel(new GridLayout(0,1,2,2));
fileMainDetails.add(fileDetailsValues, BorderLayout.CENTER);

fileDetailsLabels.add(new JLabel("File", JLabel.TRAILING));
fileName = new JLabel();
fileDetailsValues.add(fileName);
fileDetailsLabels.add(new JLabel("Path/name", JLabel.TRAILING));
path = new JTextField(5);
path.setEditable(false);
fileDetailsValues.add(path);
fileDetailsLabels.add(new JLabel("Last Modified", JLabel.TRAILING));
date = new JLabel();
fileDetailsValues.add(date);
fileDetailsLabels.add(new JLabel("File size", JLabel.TRAILING));
size = new JLabel();
fileDetailsValues.add(size);
fileDetailsLabels.add(new JLabel("Type", JLabel.TRAILING));

JPanel flags = new JPanel(new FlowLayout(FlowLayout.LEADING,4,0));
isDirectory = new JRadioButton("Directory");
isDirectory.setEnabled(false);
flags.add(isDirectory);

isFile = new JRadioButton("File");
isFile.setEnabled(false);
flags.add(isFile);
fileDetailsValues.add(flags);

int count = fileDetailsLabels.getComponentCount();
for (int ii=0; ii<count; ii++) {
fileDetailsLabels.getComponent(ii).setEnabled(false);
}

JToolBar toolBar = new JToolBar();
// mnemonics stop working in a floated toolbar
toolBar.setFloatable(false);

openFile = new JButton("Open");
openFile.setMnemonic('o');

openFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
try {
desktop.open(currentFile);
} catch(Throwable t) {
showThrowable(t);
}
gui.repaint();
}
});
toolBar.add(openFile);

editFile = new JButton("Edit");
editFile.setMnemonic('e');
editFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
try {
desktop.edit(currentFile);
} catch(Throwable t) {
showThrowable(t);
}
}
});
toolBar.add(editFile);

printFile = new JButton("Print");
printFile.setMnemonic('p');
printFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
try {
desktop.print(currentFile);
} catch(Throwable t) {
showThrowable(t);
}
}
});
toolBar.add(printFile);

// Check the actions are supported on this platform!
openFile.setEnabled(desktop.isSupported(Desktop.Action.OPEN));
editFile.setEnabled(desktop.isSupported(Desktop.Action.EDIT));
printFile.setEnabled(desktop.isSupported(Desktop.Action.PRINT));

toolBar.addSeparator();

newFile = new JButton("New");
newFile.setMnemonic('n');
newFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
newFile();
}
});
toolBar.add(newFile);

copyFile = new JButton("Copy");
copyFile.setMnemonic('c');
copyFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
showErrorMessage("'Copy' not implemented.", "Not implemented.");
}
});
toolBar.add(copyFile);

JButton renameFile = new JButton("Rename");
renameFile.setMnemonic('r');
renameFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
renameFile();
}
});
toolBar.add(renameFile);

deleteFile = new JButton("Delete");
deleteFile.setMnemonic('d');
deleteFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
deleteFile();
}
});
toolBar.add(deleteFile);

toolBar.addSeparator();

readable = new JCheckBox("Read ");
readable.setMnemonic('a');
//readable.setEnabled(false);
toolBar.add(readable);

writable = new JCheckBox("Write ");
writable.setMnemonic('w');
//writable.setEnabled(false);
toolBar.add(writable);

executable = new JCheckBox("Execute");
executable.setMnemonic('x');
//executable.setEnabled(false);
toolBar.add(executable);

JPanel fileView = new JPanel(new BorderLayout(3,3));

fileView.add(toolBar,BorderLayout.NORTH);
fileView.add(fileMainDetails,BorderLayout.CENTER);

detailView.add(fileView, BorderLayout.SOUTH);

JSplitPane splitPane = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
treeScroll,
detailView);
gui.add(splitPane, BorderLayout.CENTER);

JPanel simpleOutput = new JPanel(new BorderLayout(3,3));
progressBar = new JProgressBar();
simpleOutput.add(progressBar, BorderLayout.EAST);
progressBar.setVisible(false);

gui.add(simpleOutput, BorderLayout.SOUTH);

}
return gui;
}

public void showRootFile() {
// ensure the main files are displayed
tree.setSelectionInterval(0,0);
}

private TreePath findTreePath(File find) {
for (int ii=0; ii<tree.getRowCount(); ii++) {
TreePath treePath = tree.getPathForRow(ii);
Object object = treePath.getLastPathComponent();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)object;
File nodeFile = (File)node.getUserObject();

if (nodeFile==find) {
return treePath;
}
}
// not found!
return null;
}

private void renameFile() {
if (currentFile==null) {
showErrorMessage("No file selected to rename.","Select File");
return;
}

String renameTo = JOptionPane.showInputDialog(gui, "New Name");
if (renameTo!=null) {
try {
boolean directory = currentFile.isDirectory();
TreePath parentPath = findTreePath(currentFile.getParentFile());
DefaultMutableTreeNode parentNode =
(DefaultMutableTreeNode)parentPath.getLastPathComponent();

boolean renamed = currentFile.renameTo(new File(
currentFile.getParentFile(), renameTo));
if (renamed) {
if (directory) {
// rename the node..

// delete the current node..
TreePath currentPath = findTreePath(currentFile);
System.out.println(currentPath);
DefaultMutableTreeNode currentNode =
(DefaultMutableTreeNode)currentPath.getLastPathComponent();

treeModel.removeNodeFromParent(currentNode);

// add a new node..
}

showChildren(parentNode);
} else {
String msg = "The file '" +
currentFile +
"' could not be renamed.";
showErrorMessage(msg,"Rename Failed");
}
} catch(Throwable t) {
showThrowable(t);
}
}
gui.repaint();
}

private void deleteFile() {
if (currentFile==null) {
showErrorMessage("No file selected for deletion.","Select File");
return;
}

int result = JOptionPane.showConfirmDialog(
gui,
"Are you sure you want to delete this file?",
"Delete File",
JOptionPane.ERROR_MESSAGE
);
if (result==JOptionPane.OK_OPTION) {
try {
System.out.println("currentFile: " + currentFile);
TreePath parentPath = findTreePath(currentFile.getParentFile());
System.out.println("parentPath: " + parentPath);
DefaultMutableTreeNode parentNode =
(DefaultMutableTreeNode)parentPath.getLastPathComponent();
System.out.println("parentNode: " + parentNode);

boolean directory = currentFile.isDirectory();
boolean deleted = currentFile.delete();
if (deleted) {
if (directory) {
// delete the node..
TreePath currentPath = findTreePath(currentFile);
System.out.println(currentPath);
DefaultMutableTreeNode currentNode =
(DefaultMutableTreeNode)currentPath.getLastPathComponent();

treeModel.removeNodeFromParent(currentNode);
}

showChildren(parentNode);
} else {
String msg = "The file '" +
currentFile +
"' could not be deleted.";
showErrorMessage(msg,"Delete Failed");
}
} catch(Throwable t) {
showThrowable(t);
}
}
gui.repaint();
}

private void newFile() {
if (currentFile==null) {
showErrorMessage("No location selected for new file.","Select Location");
return;
}

if (newFilePanel==null) {
newFilePanel = new JPanel(new BorderLayout(3,3));

JPanel southRadio = new JPanel(new GridLayout(1,0,2,2));
newTypeFile = new JRadioButton("File", true);
JRadioButton newTypeDirectory = new JRadioButton("Directory");
ButtonGroup bg = new ButtonGroup();
bg.add(newTypeFile);
bg.add(newTypeDirectory);
southRadio.add( newTypeFile );
southRadio.add( newTypeDirectory );

name = new JTextField(15);

newFilePanel.add( new JLabel("Name"), BorderLayout.WEST );
newFilePanel.add( name );
newFilePanel.add( southRadio, BorderLayout.SOUTH );
}

int result = JOptionPane.showConfirmDialog(
gui,
newFilePanel,
"Create File",
JOptionPane.OK_CANCEL_OPTION);
if (result==JOptionPane.OK_OPTION) {
try {
boolean created;
File parentFile = currentFile;
if (!parentFile.isDirectory()) {
parentFile = parentFile.getParentFile();
}
File file = new File( parentFile, name.getText() );
if (newTypeFile.isSelected()) {
created = file.createNewFile();
} else {
created = file.mkdir();
}
if (created) {

TreePath parentPath = findTreePath(parentFile);
DefaultMutableTreeNode parentNode =
(DefaultMutableTreeNode)parentPath.getLastPathComponent();

if (file.isDirectory()) {
// add the new node..
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(file);

TreePath currentPath = findTreePath(currentFile);
DefaultMutableTreeNode currentNode =
(DefaultMutableTreeNode)currentPath.getLastPathComponent();

treeModel.insertNodeInto(newNode, parentNode, parentNode.getChildCount());
}

showChildren(parentNode);
} else {
String msg = "The file '" +
file +
"' could not be created.";
showErrorMessage(msg, "Create Failed");
}
} catch(Throwable t) {
showThrowable(t);
}
}
gui.repaint();
}

private void showErrorMessage(String errorMessage, String errorTitle) {
JOptionPane.showMessageDialog(
gui,
errorMessage,
errorTitle,
JOptionPane.ERROR_MESSAGE
);
}

private void showThrowable(Throwable t) {
t.printStackTrace();
JOptionPane.showMessageDialog(
gui,
t.toString(),
t.getMessage(),
JOptionPane.ERROR_MESSAGE
);
gui.repaint();
}

/** Update the table on the EDT */
private void setTableData(final File[] files) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (fileTableModel==null) {
fileTableModel = new FileTableModel();
table.setModel(fileTableModel);
}
table.getSelectionModel().removeListSelectionListener(listSelectionListener);
fileTableModel.setFiles(files);
table.getSelectionModel().addListSelectionListener(listSelectionListener);
if (!cellSizesSet) {
Icon icon = fileSystemView.getSystemIcon(files[0]);

// size adjustment to better account for icons
table.setRowHeight( icon.getIconHeight()+rowIconPadding );

setColumnWidth(0,-1);
setColumnWidth(3,60);
table.getColumnModel().getColumn(3).setMaxWidth(120);
setColumnWidth(4,-1);
setColumnWidth(5,-1);
setColumnWidth(6,-1);
setColumnWidth(7,-1);
setColumnWidth(8,-1);
setColumnWidth(9,-1);

cellSizesSet = true;
}
}
});
}

private void setColumnWidth(int column, int width) {
TableColumn tableColumn = table.getColumnModel().getColumn(column);
if (width<0) {
// use the preferred width of the header..
JLabel label = new JLabel( (String)tableColumn.getHeaderValue() );
Dimension preferred = label.getPreferredSize();
// altered 10->14 as per camickr comment.
width = (int)preferred.getWidth()+14;
}
tableColumn.setPreferredWidth(width);
tableColumn.setMaxWidth(width);
tableColumn.setMinWidth(width);
}

/** Add the files that are contained within the directory of this node.
Thanks to Hovercraft Full Of Eels. */
private void showChildren(final DefaultMutableTreeNode node) {
tree.setEnabled(false);
progressBar.setVisible(true);
progressBar.setIndeterminate(true);

SwingWorker<Void, File> worker = new SwingWorker<Void, File>() {
@Override
public Void doInBackground() {
File file = (File) node.getUserObject();
if (file.isDirectory()) {
File[] files = fileSystemView.getFiles(file, true); //!!
if (node.isLeaf()) {
for (File child : files) {
if (child.isDirectory()) {
publish(child);
}
}
}
setTableData(files);
}
return null;
}

@Override
protected void process(List<File> chunks) {
for (File child : chunks) {
node.add(new DefaultMutableTreeNode(child));
}
}

@Override
protected void done() {
progressBar.setIndeterminate(false);
progressBar.setVisible(false);
tree.setEnabled(true);
}
};
worker.execute();
}

/** Update the File details view with the details of this File. */
private void setFileDetails(File file) {
currentFile = file;
Icon icon = fileSystemView.getSystemIcon(file);
fileName.setIcon(icon);
fileName.setText(fileSystemView.getSystemDisplayName(file));
path.setText(file.getPath());
date.setText(new Date(file.lastModified()).toString());
size.setText(file.length() + " bytes");
readable.setSelected(file.canRead());
writable.setSelected(file.canWrite());
executable.setSelected(file.canExecute());
isDirectory.setSelected(file.isDirectory());

isFile.setSelected(file.isFile());

JFrame f = (JFrame)gui.getTopLevelAncestor();
if (f!=null) {
f.setTitle(
APP_TITLE +
" :: " +
fileSystemView.getSystemDisplayName(file) );
}

gui.repaint();
}

public static boolean copyFile(File from, File to) throws IOException {

boolean created = to.createNewFile();

if (created) {
FileChannel fromChannel = null;
FileChannel toChannel = null;
try {
fromChannel = new FileInputStream(from).getChannel();
toChannel = new FileOutputStream(to).getChannel();

toChannel.transferFrom(fromChannel, 0, fromChannel.size());

// set the flags of the to the same as the from
to.setReadable(from.canRead());
to.setWritable(from.canWrite());
to.setExecutable(from.canExecute());
} finally {
if (fromChannel != null) {
fromChannel.close();
}
if (toChannel != null) {
toChannel.close();
}
return false;
}
}
return created;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
// Significantly improves the look of the output in
// terms of the file names returned by FileSystemView!
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(Exception weTried) {
}
JFrame f = new JFrame(APP_TITLE);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

FileManager fileManager = new FileManager();
f.setContentPane(fileManager.getGui());

try {
URL urlBig = fileManager.getClass().getResource("fm-icon-32x32.png");
URL urlSmall = fileManager.getClass().getResource("fm-icon-16x16.png");
ArrayList<Image> images = new ArrayList<Image>();
images.add( ImageIO.read(urlBig) );
images.add( ImageIO.read(urlSmall) );
f.setIconImages(images);
} catch(Exception weTried) {}

f.pack();
f.setLocationByPlatform(true);
f.setMinimumSize(f.getSize());
f.setVisible(true);

fileManager.showRootFile();
}
});
}
}

/** A TableModel to hold File[]. */
class FileTableModel extends AbstractTableModel {

private File[] files;
private FileSystemView fileSystemView = FileSystemView.getFileSystemView();
private String[] columns = {
"Icon",
"File",
"Path/name",
"Size",
"Last Modified",
"R",
"W",
"E",
"D",
"F",
};

FileTableModel() {
this(new File[0]);
}

FileTableModel(File[] files) {
this.files = files;
}

public Object getValueAt(int row, int column) {
File file = files[row];
switch (column) {
case 0:
return fileSystemView.getSystemIcon(file);
case 1:
return fileSystemView.getSystemDisplayName(file);
case 2:
return file.getPath();
case 3:
return file.length();
case 4:
return file.lastModified();
case 5:
return file.canRead();
case 6:
return file.canWrite();
case 7:
return file.canExecute();
case 8:
return file.isDirectory();
case 9:
return file.isFile();
default:
System.err.println("Logic Error");
}
return "";
}

public int getColumnCount() {
return columns.length;
}

public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return ImageIcon.class;
case 3:
return Long.class;
case 4:
return Date.class;
case 5:
case 6:
case 7:
case 8:
case 9:
return Boolean.class;
}
return String.class;
}

public String getColumnName(int column) {
return columns[column];
}

public int getRowCount() {
return files.length;
}

public File getFile(int row) {
return files[row];
}

public void setFiles(File[] files) {
this.files = files;
fireTableDataChanged();
}
}

/** A TreeCellRenderer for a File. */
class FileTreeCellRenderer extends DefaultTreeCellRenderer {

private FileSystemView fileSystemView;

private JLabel label;

FileTreeCellRenderer() {
label = new JLabel();
label.setOpaque(true);
fileSystemView = FileSystemView.getFileSystemView();
}

@Override
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {

DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
File file = (File)node.getUserObject();
label.setIcon(fileSystemView.getSystemIcon(file));
label.setText(fileSystemView.getSystemDisplayName(file));
label.setToolTipText(file.getPath());

if (selected) {
label.setBackground(backgroundSelectionColor);
label.setForeground(textSelectionColor);
} else {
label.setBackground(backgroundNonSelectionColor);
label.setForeground(textNonSelectionColor);
}

return label;
}
}

Добавление

В итоге я решила, что мне не нужно ничего больше, чем файловый браузер. Когда он пришел к управлению файлами, просто открыв папку и с помощью ОС встроенные функциональные возможности, чтобы сделать новые файлы, переименовывать их, копировать или удалить, а также изменить флаги, было бы достаточно.

Что получил не только избавиться от многих оставшихся багов, а также удалены ли вероятность того, что адвокатов, пользователь может связаться со мной о том, как моя программа все удалила на своей локальной сети, когда они просили его, чтобы удалить символическую ссылку. ;)

15
ответ дан 8 июня 2011 в 12:06 Источник Поделиться

Андрей, это выглядит хорошо. Я пользуюсь XP и JDK6.07 и не было никаких проблем при просмотре или использовании новых/удаления/переименования.

Пару замечаний:


  1. Заголовок значок и флажок заголовки обрезаются и показать "...". Следующие починил его для меня:

    //            width = (int)preferred.getWidth()+10;  
    width = (int)preferred.getWidth()+14;

  2. Я нашел читая текст выбранного узла сложно. Это черный текст на темно-синем фоне. Чтобы jtable было гораздо легче читать белый текст на темно-синем фоне. Я вижу тонирования дерева по умолчанию также поддерживает выделение текста/номера-выбор цвета.

  3. Если вы действительно хотите, чтобы дать пользователям деньги, то, возможно, при удалении каталога вы можете попросить пользователя, чтобы увидеть, если они хотят удалить сначала все файлы при удалении каталога.

13
ответ дан 31 мая 2011 в 05:05 Источник Поделиться

Есть баг: когда таблица отсортирована, сопоставление индекса модели выбора строки и таблицы индексов модельного ряда сорвана и кнопки конечном итоге работает на другие файлы.

В ListSelectionListener должны исправить:

int row = table.getSelectionModel().getLeadSelectionIndex();
RowSorter sorter = table.getRowSorter();
if ( sorter != null ) {
row = sorter.convertRowIndexToModel( row );
}

7
ответ дан 23 мая 2013 в 07:05 Источник Поделиться

Он работает на WinXP и Win2008_64b (JRE64b) и все выглядит правильно. Для глубоких анализов, просто нажмите на каждом доступном компоненты, без каких-либо ошибок.

Но как я уже говорил, выбор на сети повесили (на WinXP, ошибок нет, убил с IDE), JProgresBar тоже, в отличие от win2008, там ProgresBar и работает только короткое время и diplay право содержание сетевого дерева.

Network_WinXP _SP3  JRE 1.6.025

Мое предположение об активном каталоге демон (только объявление) заключается в том, что у меня местный админ доступ к интрасети и, похоже, как от конечных пользователей ПК по локальной учетной записи администратора ad некоторые*** ограниченный вид сетевого дерево, рекламный некоторые*** Управляемый доступ, и я не могу попасть на объявление установка, потому что это внешний сервис.


  1. Системой WinXP SP3 для СК LanguagePack (которая не в полной локализации, как Испания, Германия, ...) записывается здесь на локальную учетную запись администратора, нажмите на значок сети в jtree умер без каких-либо ошибок, как я описал дважды.

  2. С Win7 64Б СК (к сожалению нет времени для глубокого анализа, только зарегистрированные здесь на локальную учетную запись администратора и запускается своего ребенка из консоли) значок в jtree из возвращает значение null, чтобы jtable и щелкните по открыть jbutton и возвращает только ошибку с Win7.

    FilemanNetworkWin7.JPG


  3. Win2008 доступ управляется объявление доступном контексте, потому что нет возможности создать локальную учетную запись (правила внутреннего распорядка).

6
ответ дан 2 июня 2011 в 01:06 Источник Поделиться