0

我编写了一个与sockets. 服务器是多线程的,可以容纳多个客户端。

现在我在我的客户端应用程序中使用 a jTree model,并且在我的服务器上我有一个文件夹,其中包含虚构的项目文件夹和文件。首先,这个应用程序只是客户端与服务器上的数据库,现在我希望它完全通过套接字连接运行。

唯一的问题是 jTree 模型是在服务器上创建的。因此,当程序启动时,客户端要求服务器创建项目文件夹的 jTree 模型,用户将在客户端应用程序中使用其文件。

服务器将发送一个respone带有 jTree 模型的文件,客户端将这个模型放入jTree swing component. jTree 已成功显示给用户(因此 Tree 模型succesfully通过套接字连接发送),但是当用户想要展开第一个项目文件夹映射时:jTree 显示例如:'testProject' 作为文件夹。例如文件夹 testProject 包含一些文件:

  • 测试项目.exe
    • 测试.java
    • test2.java
  • 源代码

正如您在上面的示例中看到的,当用户双击 jTree 中的“testProject”时,jTree 应该向用户显示上面的树。

现在我的问题

我认为问题在于服务器只创建第一个文件夹的模型。就像它只发送一个带有“projectFolder”的模型。但我希望above structure发送给用户,以便用户可以使用 jTree 从服务器下载文件。(我稍后会实施)。

我如何full model从服务器获取 jTree 可以通过项目文件夹和他的所有文件向用户显示完整模型。

为了让一切更清楚一点:

我的代码

我在客户端上使用这段代码来调用在服务器上创建 jTree 模型的方法。

public ProjectTreeModel getTreeModel(String projectName) throws ClassNotFoundException {
    try {
        //Creating empty object to invoke te mehod on the server.
        paramObject parameters = new paramObject();
        parameters.string1 = projectName;

        //Creating package to invoke the right method on the server.
        Packet data = new Packet("treemodel.GetModel",parameters);

        //sends in this case an empty object to the server and invokes the treemodel.GetModel method on the server.
        oos.writeObject(data);
        oos.flush();

        ProjectTreeModel model = (ProjectTreeModel) ois.readObject();

        return model;

    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return null;
}

我在服务器上使用这段代码来创建 projectModel 并将其作为对象发送回客户端,以便在前面的代码示例中将其作为 jTree 模型返回。

if(data.getMethod().equals("treemodel.GetModel")) 
         { 
             //in this example i don't use this object, just ignore it.
             paramObject parameters = (paramObject) data.getObject();


             //Extract the information from User
             String projectName = parameters.string1;

             ProjectTreeModel treemodel = new ProjectTreeModel();
             treemodel.newRootPath(projectName);



             oos.writeObject(treemodel);
             output.flush();
             form.sendOutput("ProjectTreeModel succesfully sended to: " + Email);
         }

最后这就是我创建 TreeModel 的方式。

import java.io.File;
import java.io.Serializable;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;


public class ProjectTreeModel implements TreeModel, Serializable
{
File f;
private static String rootPath = "src/authorsystem/Projects";

public static void newRootPath(String newRoot)
{
    String desktopPath = System.getProperty("user.home") + "\\Desktop";
    desktopPath.replace("\\", "/");
    rootPath = desktopPath + "\\projectfolders";
}

@Override
public Object getRoot() {
    //userName = LogInForm.ingelogt;

    f = new File(rootPath);
    return f;
}

@Override
public Object getChild(Object parent, int index) {
    File pathName = (File) parent;
    String[] fileNames = pathName.list();
    return new File(pathName.getPath(), fileNames[index]);
}

@Override
public int getChildCount(Object parent) {
    File pathName = (File) parent;
    if(pathName.list() != null)
    {
        String[] fileNames = pathName.list();
        return fileNames.length;
    }
    else
    {
        return 0;
    }
}

@Override
public boolean isLeaf(Object node) {
    return ((File)node).isFile();
}

@Override
public void valueForPathChanged(TreePath path, Object newValue) {

}

@Override
public int getIndexOfChild(Object parent, Object child) {
    File pathName = (File) parent;
    File childName = (File) child;
    if(pathName.isDirectory())
    {
        String[] fileNames = pathName.list();
        for (int i = 0; i < fileNames.length; i++) {
            if(pathName.compareTo(childName) == 0)
            {
                return i;
            }
        }
    }
    return -1;
}

@Override
public void addTreeModelListener(TreeModelListener l) {

}

@Override
public void removeTreeModelListener(TreeModelListener l) {

}

}

我希望有人可以帮助我,或者只是帮助我解决这个问题的想法。

4

1 回答 1

0

好吧,如果有人发现这个,就关闭这个话题。很久以前我就研究过这个,但这就是我们管理它的方式:

对于 treeModel,我们制作了自定义节点。我们只发送必须在树中显示的数据,而不是通过套接字连接发送 JTreeModel 对象。在客户端从服务器接收到数据后,我们遍历所有数据并检查节点是父节点还是子节点。这基本上可以通过我的问题中上面覆盖的 TreeModel 类代码片段来完成。

于 2012-11-24T13:48:18.120 回答