我编写了一个与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) {
}
}
我希望有人可以帮助我,或者只是帮助我解决这个问题的想法。