1

我正在使用 FTP4j,我想用 FTP 服务器的根目录填充 JTree。我试过使用 FTP4j 的 currentDirectory() 方法,但它只返回一个没有用的“/”。我还尝试将 ftp:// url 传递给初始化 JTree 的方法,这也不起作用。这是我的第一个 Swing 程序,所以我有点不知道该去哪里。这是代码:

package net.emptybox.ui;

import java.awt.EventQueue;

import javax.swing.JFrame;
import net.miginfocom.swing.MigLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import javax.swing.JSplitPane;
import javax.swing.JSeparator;
import javax.swing.JTree;
import javax.swing.JTextArea;
import java.awt.Component;
import java.io.File;

import net.emptybox.ui.FTP;

import javax.swing.Box;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;



public class GUI {

    static JFrame frame;
    static private JSplitPane splitPane;
    static private JLabel lblServer;
    static private JTextField serverField;
    static private JLabel lblPort;
    static private JTextField portField;
    static private JLabel lblUsername;
    static private JTextField usernameField;
    static private JLabel lblPassword;
    static private JTextField passwordField;
    static private JButton connectButton;
    static private JSeparator separator;
    static private JTextArea detailArea;
    static private JButton downloadButton;
    static private JButton uploadButton;
    static private Component horizontalGlue;
    static private JTextField fileField;
    static private JButton goButton;
    static private Component horizontalGlue_1;

    static FileSystemModel fileSystemModel;
    static JLabel consoleLabel;
    private static Component verticalGlue;
    private static JScrollPane scrollPane;
    static JTree fileTree;

    /**
     * Launch the application.
     */

    /**
     * Create the application.
     */
    public GUI() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    public static void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 648, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new MigLayout("", "[grow]", "[][][][grow][]"));

        lblServer = new JLabel("Server:");
        frame.getContentPane().add(lblServer, "flowx,cell 0 0");

        consoleLabel = new JLabel("");
        frame.getContentPane().add(consoleLabel, "flowx,cell 0 1");

        separator = new JSeparator();
        frame.getContentPane().add(separator, "cell 0 2");

        splitPane = new JSplitPane();
        splitPane.setOneTouchExpandable(true);
        splitPane.setContinuousLayout(true);
        frame.getContentPane().add(splitPane, "cell 0 3,grow");

        detailArea = new JTextArea();
        detailArea.setEditable(false);
        splitPane.setRightComponent(detailArea);

        scrollPane = new JScrollPane();
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        splitPane.setLeftComponent(scrollPane);

        serverField = new JTextField();
        frame.getContentPane().add(serverField, "cell 0 0,growx");

        lblPort = new JLabel("Port:");
        frame.getContentPane().add(lblPort, "cell 0 0");

        portField = new JTextField();
        frame.getContentPane().add(portField, "cell 0 0,growx");

        lblUsername = new JLabel("Username:");
        frame.getContentPane().add(lblUsername, "cell 0 0");

        usernameField = new JTextField();
        frame.getContentPane().add(usernameField, "cell 0 0,growx");

        lblPassword = new JLabel("Password:");
        frame.getContentPane().add(lblPassword, "cell 0 0");

        passwordField = new JTextField();
        frame.getContentPane().add(passwordField, "cell 0 0,growx");


        connectButton = new JButton("Connect");
        frame.getContentPane().add(connectButton, "cell 0 0");

        if (serverField.getText() == null || usernameField.getText() == null || passwordField.getText() == null) {
            connectButton.disable();
        } else {
            connectButton.enable();
        }

        if (portField.getText() == null) {
            portField.setText("21");
        }

        connectButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                FTP.connect(serverField.getText(), portField.getText(), usernameField.getText(), passwordField.getText());
            }
        });

        downloadButton = new JButton("Download");
        frame.getContentPane().add(downloadButton, "flowx,cell 0 4");
        downloadButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });

        uploadButton = new JButton("Upload");
        frame.getContentPane().add(uploadButton, "cell 0 4");
        uploadButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });

        horizontalGlue_1 = Box.createHorizontalGlue();
        frame.getContentPane().add(horizontalGlue_1, "cell 0 4,growx");

        fileField = new JTextField();
        frame.getContentPane().add(fileField, "cell 0 4");
        fileField.setColumns(200);

        goButton = new JButton("Go");
        goButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });
        frame.getContentPane().add(goButton, "cell 0 4");

        horizontalGlue = Box.createHorizontalGlue();
        frame.getContentPane().add(horizontalGlue, "cell 0 4,alignx leading");

        verticalGlue = Box.createVerticalGlue();
        frame.getContentPane().add(verticalGlue, "cell 0 1");
    }

    private String getFileDetails(File file) {
        if (file == null)
          return "";
        StringBuffer buffer = new StringBuffer();
        buffer.append("Name: " + file.getName() + "\n");
        buffer.append("Path: " + file.getPath() + "\n");
        buffer.append("Size: " + file.length() + "\n");
        return buffer.toString();
      }

    public static void populateTree(String directory) {
        fileSystemModel = new FileSystemModel(new File(directory));

        fileTree = new JTree(fileSystemModel);
        scrollPane.setViewportView(fileTree);
    }
}

当与服务器成功建立连接并且用户已登录时,填充树由另一个类调用。

4

1 回答 1

0

You're going to want to create your own TreeModel.

Once the user has connected successfully, you'll need to query the site for more information, there are no models available in the default implementation that will do what you want, you're going have to work for it ;)

Let's start with the FTP side.

String current = ftpSite.getCurrentDirectory(); // Just in case you want to come back
ftpSite.changeDirectort("/"); // Move to the root directory
FPTFile[] fileList = ftpSite.list(); // Get the list of files.

Now, how you go about this comes down to you. But basically, I would construct a MutableTreeNode as the root node (for the JTree).

From there you can add new (MutableTreeNode) nodes to the root as you need.

You could check out http://www.jroller.com/Thierry/entry/swing_lazy_loading_in_a for some more ideas on how to achieve all this.

于 2012-07-10T05:22:11.497 回答