我编写了一个与sockets
连接的客户端和服务器应用程序。
服务器是多线程的,可以容纳多个客户端。
现在我在我的客户端应用程序中使用了jTree model
,并且在我的服务器上,我有一个包含虚构项目文件夹和文件的文件夹。
首先,这个应用程序只是客户端与服务器上的数据库,现在我希望它完全通过套接字连接进行操作。
唯一的问题是在服务器上创建了jTree模型。因此,当程序启动时,客户端要求服务器创建项目文件夹的jTree模型,用户将在客户端应用程序中使用其文件。
服务器将在其中发送带有jTree模型的respone
,客户端将此模型放入jTree swing component
。
jTree成功显示给用户(因此Tree模型通过套接字连接发送succesfully
),但是当用户想要展开第一个项目文件夹地图时:jTree显示例如:'testProject'作为文件夹。
例如,文件夹testProject包含一些文件:
正如您在上面的示例中所看到的,当用户双击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) {
}
}
我希望有人可以帮助我,或者只是帮助我解决如何解决这个问题的想法。
答案 0 :(得分:0)
好的,如果有人发现这个话,请关闭此主题。 很久以前我就是在研究这个问题,但这就是我们管理它的方式:
对于treeModel,我们制作了自定义节点。我们只发送必须在树中显示的数据,而不是通过套接字连接发送JTreeModel对象。 客户端从服务器收到数据后,我们通过所有数据进行迭代,并检查节点是父节点还是子节点。 这可以基本上使用我的问题中上面覆盖的TreeModel类代码片段来完成。