在SWTä¸ï¼Œé€šå¸¸éœ€è¦å¼€å¤šä¸ª¾U¿ç¨‹æ¥æ‰§è¡Œä“QåŠ¡ï¼Œå› äØ“ä¸Èº¿½E‹äØ“UI¾U¿ç¨‹åQŒä¸èƒ½ç”¨å¤ªé•¿çš„æ—¶é—´æ¥æ‰§è¡ŒæŸä¸ªä»ÕdŠ¡åQŒå¦åˆ™ä¼šé€ æˆå¤±åŽ»å“应的å‡è±¡ã€?br />SWT的线½E‹é€šä¿¡æœ‰å‡ ä¸ªè¦æ³¨æ„的地方:
1ã€å·¥ä½œçº¿½E‹è®¿é—®UI¾U¿ç¨‹ã€‚ä¸èƒ½åœ¨éžUI¾U¿ç¨‹ä¸ç›´æŽ¥è®¿é—®UI控äšgçš„å€û|¼Œè¦èŽ·å¾—æˆ–è®„¡½®æŽ§äšg的值必™å»é€šè¿‡Display对象的asyncExec()或syncExec()函数åQŒä¸€èˆ¬çš„使用æ–ÒŽ³•是:
//代ç AåQ?br />Â
Display disp Â
=
  Display.getDefault();
Â
if
 (dispÂ
!=
Â
null
 )  {
   disp.asyncExec(
   Â
new
  Runnable()  {
   Â
public
 Â
void
  run()  {
      Â
//
 在这里设¾|®æˆ–获得控äšg的值Â?/span>
 }Â
}Â
);Â
}Â
2ã€å†…部类与外部类的交‹¹ã€‚内部类调用外部¾cÕd±€éƒ¨å˜é‡æ—¶åQŒè¯¥å˜é‡å¿…须是final的,˜q™æ ·åœ¨å–得控件的值厘q”回¾l™å¤–éƒ¨ç±»å¤„ç†æ—¶å°±æ¯”较éºÈƒ¦ã€‚例如,在上é¢çš„ä»£ç ŒDµä¸åQŒæœ‰ä¸ªåŒ¿å内部类实现了Runnable接å£åQŒåœ¨é‡Œé¢çš„run()函数里å¯ä»¥è®¿é—®åˆ°UI对象åQŒä½†æ˜¯ï¼Œå¾—到了对象的值怎么告诉外é¢çš„代ç å‘¢åQŸå‡å¦‚用普通的局部å˜é‡ä¼ 递进去,ç”׃ºŽæ˜¯final的,是ä¸èƒ½èµ‹å€¼çš„åQŒæ‰€ä»¥éœ€è¦æœ‰ä¸€ä¸ªå°è£…ç±»æ¥æŠŠéœ€è¦è¿”回的å˜é‡ž®è£…èµäh¥åQŒè¿™ä¸ªå°è£…类是final的,但里é¢çš„æˆå‘˜å˜é‡æ˜¯å¯å˜çš„åQŒè¿™æ ·å°±æŠŠå†…éƒ¨ç±»é‡Œå¾—åˆ°çš„ä¸œè¥¿ä¼ é€’åˆ°äº†å¤–éƒ¨ï¼Œä¸è¿‡ä¼ég¹Žæ¯”较éºÈƒ¦åQŒä¸çŸ¥é“有没有更好的办法ã€?br />//代ç BåQ?br />
class StringWrapper {
   public String uiValue;
}
StringWrapper sw = new StringWrapper();Â
Display disp  =  Display.getDefault();
 if (disp != null )  {
   disp.asyncExec(
    new  Runnable()  {
    public  void  run()  {
        sw.uiValue = text.getText();//å‡è®¾text是一个文本框对象
       // 在这里设¾|®æˆ–获得控äšg的值Â?/span>
    }Â
   }Â
   );Â
}Â
//˜q™é‡Œž®±å¯ä»¥å¯¹sw.uiValueçš„å€ÆD¿›è¡Œè®¿é—?/span>
3ã€çº¿½E‹é—´çš„åŒæ¥ã€‚在上é¢çš„代ç Bä¸ï¼Œé€šè¿‡asyncExec()函数æ¥å–得控件的值所需è¦çš„æ—‰™—´æ¯”较长,如果在åŽé¢é©¬ä¸Šè®¿é—®é‚£äº›å€¼æ˜¯å¾—ä¸åˆ°çš„åQŒäºŽæ˜¯å°±éœ€è¦æœ‰ä¸ªåŒæ¥çš„问题åQŒå³åœ¨æŽ§ä»¶å€¼å–得之å‰å…ˆä¸è¿›è¡Œä¸‹ä¸€æ¥æ“作。å¯ä»¥é€šè¿‡synchronizedå—åŠwait()åQŒnotify()机制æ¥å®žçŽ°åŒæ¥ã€?br />
//代ç CåQ?/span>
class StringWrapper {
   public String uiValue;
}
StringWrapper sw = new StringWrapper();Â
Display disp  =  Display.getDefault();
 if (disp != null )  {
   disp.asyncExec(
    new  Runnable()  {
    public  void  run()  {
        synchronized(sw){
          sw.uiValue = text.getText();//å‡è®¾text是一个文本框对象
            sw.notify();
         }
       // 在这里设¾|®æˆ–获得控äšgçš„å€?/span>
Â
    }Â
   }Â
   );Â
}
synchronized(sw){
  sw.wait();
}Â
//˜q™é‡Œž®±å¯ä»¥å¯¹sw.uiValueçš„å€ÆD¿›è¡Œè®¿é—?/span>
但是˜q™é‡Œä¼šå¸¦æ¥ä¸€ä¸ªé—®é¢˜ï¼Œå‡å¦‚很快ž®Þpƒ½å–得控äšgçš„å€û|¼Œä½†åŽé¢è¿˜æœ‰å¾ˆé•¿ä¸€ŒD‰|—¶é—´æ‰ä¼šç”¨åˆ°è¯¥å€û|¼Œå¦‚果把sw.wait()è¯å¥æ”‘Öœ¨æ¯”较åŽçš„地方åQŒå°±æœ‰å¯èƒ½é€ æˆæ»é”åQŒå› 为swå·²ç»è¢«notifyä¹‹åŽæ‰å¼€å§‹waitçš„ï¼Œå†æ²¡æœ‰å…¶ä»–线½E‹æ¥notify它了åQŒå®ƒž®±åªèƒ½ä¸€ç›´waitä¸‹åŽ»â€¦â€¦ã€‚äØ“äº†è§£å†Œ™¿™ä¸ªé—®é¢˜ï¼Œå¯ä»¥(1)把sw.wait()紧跟在disp.asyncExec()åŽé¢åQ?2)¾l™wait()讄¡½®ä¸€ä¸ªtimeout傿•°åQŒåˆ°äº†ä¸€å®šçš„æ—‰™—´˜q˜æ²¡æœ‰ä¸œè¥¿notify它,它就自己‘…时。但˜q™ä¸¤¿U办法似乎都比较牵强åQŒæ²¡æœ‰å‘³çš„ä¿è¯åQŒJDKæ–‡æ¡£é‡Œé¢æœ‰ä¸ªä¾‹ååQŒæ˜¯ç”¨whileæ¥åˆ¤æ–是å¦å·²¾lè¾¾åˆîCº†è¦æ±‚åQŒå¦‚果已¾lè¾¾åˆîCº†ž®×ƒ¸å†waitã€?br />//代ç DåQ?/span>
class StringWrapper {
   public String uiValue;
   public boolean isValueSet;//是å¦å·²ç»å–得了控件的å€?/span>
}
StringWrapper sw = new StringWrapper();Â
sw.isValueSet = false;
Display disp  =  Display.getDefault();
 if (disp != null )  {
   disp.asyncExec(
    new  Runnable()  {
    public  void  run()  {
        synchronized(sw){
          sw.uiValue = text.getText();//å‡è®¾text是一个文本框对象
            sw.isValueSet = true;
            sw.notify();
         }
       // 在这里设¾|®æˆ–获得控äšgçš„å€?/span>
Â
    }Â
   }Â
   );Â
}
synchronized(sw){
  while(!sw.isValueSet){
    try{
      sw.wait();
    }catch (InterruptedException e){
    }
  }
}Â
//˜q™é‡Œž®±å¯ä»¥å¯¹sw.uiValueçš„å€ÆD¿›è¡Œè®¿é—?/span>

]]>