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);

实际上是在调用我的客户端从 peoples TABLE 中获取数据,以获取 pID 作为回报,这将返回到 JTEXTFIELD 应该执行下一行的地方

     String pID = pID_Manage.getText();  

但是至于下一行的工作是将某些字符串添加到具有 pID 和 pName_Sub 组合的数组列表中,但是当执行它时,我发现我的数组列表没有 pID ..so 而不是真正的结果应该是像这样

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

它显示为这样

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

我需要再次重新提交第二次才能获得 ID...似乎代码的执行速度太快,并且存储 ID 以返回 JTEXTFIELD 很慢..有什么办法可以减慢速度?

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

以下是您的解决方案:
将 changelistener 放在 jtextfield pID_Manage 上
并在其中调用您的数组填充方法,
以便仅在收到 id 并将其分配给 jtextfield 时填充数组。

于 2012-04-13T19:34:09.187 回答
-1

我不确定这是否可行,但是尝试防止散列中的彩虹表和其他安全问题,做类似的事情

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

可能会成功。但同样我从未测试过这个,这只是一个建议

于 2012-04-13T20:25:45.370 回答