1

以下のこのコードから

  if(!validate_containsNum && !validate_isNumber && !validate_isBlankField){
                a.sendMsgToSlave("DATA:TAKE:PEOPLEs:"+pName_sub);
                appendToGlobalDataLog("SEND : DATA:TAKE:PEOPLEs:"+pID+":"+p_sub);
                String pID = pID_Manage.getText();  
                a.addtoArrayList("DATA:TAKE:PEOPLEs:"+pID+":"+pName_sub);
                at.sendToServer("DATA:TAKE:PEOPLEs:"+pID+":"+pName_sub);



        }

上記のコードから、この行で問題が発生しています

      a.sendMsgToSlave("DATA:TAKE:PEOPLEs:"+pName_sub);

次の行が実行されるべきJTEXTFIELDに返されるpIDを取得するために、人々のTABLEからデータをフェッチするために実際にクライアントを呼び出しています

     String pID = pID_Manage.getText();  

しかし、次の行の仕事は、特定の文字列をpIDとpName_Subの組み合わせを持つ配列リストに追加することですが、実行すると、配列リストにpIDがないことがわかりました..実際の結果の代わりにこのような

     DATA:TAKE:PEOPLEs:1:ALBERT  (In my arraylist)

それはこのように示します

     DATA:TAKE:PEOPLEs::ALBERT (the id is missing)

ID を取得できるのは 2 回目だけです。コードの実行が速すぎて、JTEXTFIELD に返される ID の保存が遅いようです。速度を落とす方法はありますか?

4

4 に答える 4

1

手っ取り早い解決策は を呼び出すことThread.Sleepですが、より良い解決策は のコードを変更してa.sendMsgToSlave()、id が設定された後にのみ返されるようにすることです。そうすれば、実行がステートメントに到達したときに、sendMsgToSlave()毎回 ID の準備が確実に整うことが確実にわかります。

于 2012-04-13T19:26:43.200 に答える
1

イベントの非同期sendMsgToSlaveチェーンを開始すると、後でテキスト フィールドが更新されます。設定されている ID フィールドに依存するコードが、実際に発生したイベントに反応して実行されるように、アーキテクチャを変更する必要があります。他の人が言ったように、同期を作成できますがsendMsgToSlave、その名前から判断すると、それは本当に良い考えではないと思います。できることは、残りのタスクを実行する ID フィールドに変更リスナーをアタッチすることです。あなたが必要とする正確なリスナーがわからないので、概算します:

pID_Manager.addChangeListener(new ChangeListener() { 
  public void textChanged(ChangeEvent e) {
    pID_manager.removeChangeListener(this);
    String pID = pID_Manage.getText();  
    a.addtoArrayList("DATA:TAKE:PEOPLEs:"+pID+":"+pName_sub);
    at.sendToServer("DATA:TAKE:PEOPLEs:"+pID+":"+pName_sub);
}};

したがって、基本的な考え方は、リスナーが適切なイベントに反応し、起動するとすぐに登録を解除するというものです。

于 2012-04-13T19:34:29.337 に答える
0

以下はあなたの解決策です:
jtextfield pID_Manageにchangelistenerを置き、その中で配列移入
メソッドを呼び出して
、IDが受信されてjtextfieldに割り当てられたときにのみ配列が移入されるようにします。

于 2012-04-13T19:34:09.187 に答える
-1

これが機能するかどうかはわかりませんが、ハッシュやその他のセキュリティの問題でレインボーテーブルを防止しようとするなど、次のようなことを行います

for(int i = 0; i < 100; i++) {
}

トリックを行うかもしれません。しかし、繰り返しますが、これをテストしたことはありません。これは単なる提案です

于 2012-04-13T20:25:45.370 に答える