通过套接字连接发送后,jTreeModel不会展开

时间:2012-05-21 18:32:24

标签: java swing sockets jtree

我编写了一个与sockets连接的客户端和服务器应用程序。 服务器是多线程的,可以容纳多个客户端。

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

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

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

  • testProject.exe
    • test.java
    • test2.java
  • SRC

正如您在上面的示例中所看到的,当用户双击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) {

}

}

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

1 个答案:

答案 0 :(得分:0)

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

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

相关问题