に接続するクライアントおよびサーバー アプリケーションを作成しましたsockets
。サーバーはマルチスレッド化されており、複数のクライアントを保持できます。
現在、クライアントアプリケーションで a を使用していますjTree model
。サーバーには、架空のプロジェクトフォルダーとファイルを含むフォルダーがあります。最初は、このアプリケーションはサーバー上のデータベースを使用したクライアント側のみでしたが、今ではソケット接続を介して完全に動作するようにしたいと考えています。
唯一の問題は、jTree モデルがサーバー上に作成されることです。そのため、プログラムが起動すると、クライアントはサーバーにプロジェクト フォルダの jTree モデルを作成するように要求します。ユーザーはクライアント アプリケーションでそのファイルを使用して使用します。
サーバーはrespone
jTree モデルを含む を送信し、クライアントはこのモデルを に配置しjTree swing component
ます。jTree は正常にユーザーに表示されます (そのため、ツリー モデルはsuccesfully
ソケット接続を介して送信されます) が、ユーザーが最初の projectfolder マップを展開する場合: jTree は、たとえば、フォルダーとして「testProject」を表示します。たとえば、フォルダー testProject にはいくつかのファイルが含まれています。
- testProject.exe
- 置き場
- test.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) {
}
}
誰かが私を助けてくれることを願っています.