0

に接続するクライアントおよびサーバー アプリケーションを作成しましたsockets。サーバーはマルチスレッド化されており、複数のクライアントを保持できます。

現在、クライアントアプリケーションで a を使用していますjTree model。サーバーには、架空のプロジェクトフォルダーとファイルを含むフォルダーがあります。最初は、このアプリケーションはサーバー上のデータベースを使用したクライアント側のみでしたが、今ではソケット接続を介して完全に動作するようにしたいと考えています。

唯一の問題は、jTree モデルがサーバー上に作成されることです。そのため、プログラムが起動すると、クライアントはサーバーにプロジェクト フォルダの jTree モデルを作成するように要求します。ユーザーはクライアント アプリケーションでそのファイルを使用して使用します。

サーバーはresponejTree モデルを含む を送信し、クライアントはこのモデルを に配置しjTree swing componentます。jTree は正常にユーザーに表示されます (そのため、ツリー モデルはsuccesfullyソケット接続を介して送信されます) が、ユーザーが最初の projectfolder マップを展開する場合: jTree は、たとえば、フォルダーとして「testProject」を表示します。たとえば、フォルダー testProject にはいくつかのファイルが含まれています。

  • testProject.exe
  • 置き場
    • test.java
    • test2.java
  • ソース

上記の例でわかるように、ユーザーが jTree の「testProject」をダブルクリックすると、jTree は上記のツリーをユーザーに表示する必要があります。

今私の問題

問題は、サーバーが最初のフォルダーのモデルのみを作成することだと思います。「projectFolder」を含むモデルのみを送信するように。しかしabove structure、ユーザーがjTreeを使用してサーバーからファイルをダウンロードできるように、ユーザーに送信したいのです。(後で実装するもの)。

full modeljTreeがプロジェクトフォルダーとすべてのファイルを含む完全なモデルをユーザーに表示できることをサーバーから取得するにはどうすればよいですか。

すべてをもう少し明確にするために:

私のコード

サーバー上で 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 に答える