0

私が取り組んでいるクライアント/サーバー MMORPG があり、物事を正しく実行したいと考えています (実際には不可能です)。私の質問は次のとおりです。サーバーからのコマンド/応答をリッスンするクラスに、GUI 項目 (JInternalFrame、JPanels など) への参照を渡す最良の方法は何ですか。今、これは私が行っていることであり、すぐにかなり大きくなります。

MyCommandReciever(DataInputStream commandIn, DefaultListModel modelUserList, JInternalFrame skillsFrame, Container skillsPanelHeader, Container skillsPanelContent, JInternalFrame characterFrame){
    this.commandIn = commandIn;
    this.modelUserList = modelUserList;
    this.skillsFrame = skillsFrame;
    this.skillsPanelHeader = skillsPanelHeader;
    this.skillsPanelContent = skillsPanelContent;
    this.characterFrame = characterFrame;
}

JInternalFrames を MyCommandReciever にどんどん渡し続けたくありません。

このようなことをするのは理にかなっていますか??

Component[] c = panel.getComponents();
for(int i = 0; i < c.length; i++) {
    System.out.println(c[i].getClass().getSimpleName());
}

または、メイン クラス内からメイン クラス (GUI を含む) のインスタンスを作成し、それを MyCommandReciever に渡して、すべてにアクセスできるようにする方法はありますか (おそらくこのように):

MyCommandReciever(DataInputStream commandIn, DefaultListModel modelUserList, MyClient m){

この最後のアプローチが進むべき道である場合(そうではないことを望んでいますが、それのインスタンスを作成するクラスからそれを渡す必要がありますか(Character.javaはMyClient.javaのインスタンスを作成します)、それ自体( MyClient.java) を作成し、それを MyClient.java から MyCommandReciever.java に渡しますか?

最後の質問がわかりにくかったら申し訳ありません... 分解してみましょう:

Character.java 内:

if (playSuccess.contains("true")){
    z++; //to turn off the commandIn functionality in Character screen when MyClient is running
    frame.dispose();
    new MyClient(accountName, playWho, commandIn, messageIn, commandOut, messageOut, sM, sC);

MyClient.java 内:

commandReciever = new MyCommandReciever(commandIn, modelUserList, skillsFrame, skillsPanelHeader, skillsPanelContent, characterFrame);

したがって、character.java では、MyClient のインスタンスを作成する (そして変数に割り当てる) 必要がありますが、同時にその割り当てられた変数を MyClient に渡します。(これを入力しているので、それは不可能に思えます)。

私を導いてください:D 明らかに、私はこの最後のアイデアに頭を悩ませました.

4

2 に答える 2

3

あなたができることは、「オブザーバー」または「イベントソース」と呼ばれるパターンを使用することです:

  1. コマンド レシーバーとメイン クラスの間のインターフェイスを定義し、何か興味深いことが起こったときにコマンド レシーバーが呼び出すメソッドを定義します。
  2. (明らかに、コマンド レシーバーは、イベントを送信できるようにするために、このインターフェイスを実装するオブジェクトへの参照を保持する必要があります。)
  3. メイン クラス自体またはネストされたクラスのいずれかによって、メイン クラスにインターフェイスを実装し、インターフェイスを更新することによってコマンド レシーバーからのイベントに応答します。実装をコマンド レシーバーに渡します。

このように、コマンド レシーバーとユーザー インターフェイスは完全に切り離されており、ある時点でデータ表示以外のものを使用することにした場合でもJInternalFrame、何百もの場所でコードを変更する必要はありません。

MVC またはその多くの兄弟の 1 つを使用することも検討できます。

于 2012-04-26T07:34:48.920 に答える
0

これが私が採用することにしたアプローチです。他のアドバイスに感謝しますが、私のニーズには少し複雑に思えました:

私のメインのGUIクラスでは:

commandReciever = new MyCommandReciever(commandIn, this); //passing in instance of my main gui class

私のコマンドレシーバークラス(サーバーと通信するクラス):

MyClient m; //for access to the GUI pieces

MyCommandReciever(DataInputStream commandIn, MyClient m){
    this.commandIn = commandIn;
    this.m = m;
}

コマンド レシーバー クラスからメイン gui クラスのコンポーネントを編集する方法の例:

m.modelUserList.clear();
for (int i = 0; i < CharactersList.length; i++){
    m.modelUserList.addElement(CharactersList[i]);
}
于 2012-04-26T18:15:11.877 に答える