ºìÁªLinuxÃÅ»§
Linux°ïÖú

Java¿ª·¢ÖеÄḬ̈߳²È«Ñ¡ÔñÓëSwing

·¢²¼Ê±¼ä:2006-05-03 19:05:51À´Ô´:ºìÁª×÷Õß:ÌìɽÀÏͯ
Swing APIµÄÉè¼ÆÄ¿±êÊÇÇ¿´ó¡¢Áé»îºÍÒ×Óá£ÌرðµØ£¬ÎÒÃÇÏ£ÍûÄÜÈóÌÐòÔ±ÃÇ·½±ãµØ½¨Á¢ÐµÄSwing×é¼þ£¬²»ÂÛÊÇ´ÓÍ·¿ªÊ¼»¹ÊÇͨ¹ýÀ©Õ¹ÎÒÃÇËùÌṩµÄһЩ×é¼þ¡£

¡¡¡¡³öÓÚÕâ¸öÄ¿µÄ£¬ÎÒÃDz»ÒªÇóSwing×é¼þÖ§³Ö¶àÏ̷߳ÃÎÊ¡£Ïà·´£¬ÎÒÃÇÏò×é¼þ·¢ËÍÇëÇó²¢ÔÚµ¥Ò»Ïß³ÌÖÐÖ´ÐÐÇëÇó¡£
¡¡¡¡±¾ÎÄÌÖÂÛÏ̺߳ÍSwing×é¼þ¡£Ä¿µÄ²»½öÊÇΪÁË°ïÖúÄãÒÔḬ̈߳²È«µÄ·½Ê½Ê¹ÓÃSwing API£¬¶øÇÒ½âÊÍÁËÎÒÃÇΪʲô»áÑ¡ÔñÏÖÔÚÕâÑùµÄÏ̷߳½°¸¡£

¡¡¡¡±¾ÎÄ°üÀ¨ÒÔÏÂÄÚÈÝ£º
¡¡¡¡¡¡µ¥Ï̹߳æÔò£ºSwingÏß³ÌÔÚͬһʱ¿Ì½öÄܱ»Ò»¸öÏß³ÌËù·ÃÎÊ¡£Ò»°ãÀ´Ëµ£¬Õâ¸öÏß³ÌÊÇʼþÅÉ·¢Ị̈߳¨event-dispatching thread£©¡£

¡¡¡¡¡¡¹æÔòµÄÀýÍ⣺ÓÐЩ²Ù×÷±£Ö¤ÊÇḬ̈߳²È«µÄ¡£

¡¡¡¡¡¡Ê¼þ·Ö·¢£ºÈç¹ûÄãÐèÒª´Óʼþ´¦Àí£¨event-handling£©»ò»æÖÆ´úÂëÒÔÍâµÄµØ·½·ÃÎÊUI£¬ÄÇôÄã¿ÉÒÔʹÓÃSwingUtilitiesÀàµÄinvokeLater()»òinvokeAndWait()·½·¨¡£

¡¡¡¡¡¡´´½¨Ị̈߳ºÈç¹ûÄãÐèÒª´´½¨Ò»¸öÏß³Ì??±ÈÈçÓÃÀ´´¦ÀíһЩºÄ·Ñ´óÁ¿¼ÆËãÄÜÁ¦»òÊÜI/OÄÜÁ¦ÏÞÖƵŤ×÷??Äã¿ÉÒÔʹÓÃÒ»¸öÏ̹߳¤¾ßÀàÈçSwingWorker»òTimer¡£

¡¡¡¡¡¡ÎªÊ²Ã´ÎÒÃÇÕâÑùʵÏÖSwing£ºÎÒÃǽ«ÓÃһЩ¹ØÓÚSwingµÄḬ̈߳²È«µÄ±³¾°×ÊÁÏÀ´½áÊøÕâƪÎÄÕ¡£

¡¡¡¡SwingµÄ¹æÔòÊÇ£º

¡¡¡¡Ò»µ©Swing×é¼þ±»¾ßÏÖ»¯£¨realized£©£¬ËùÓпÉÄÜÓ°Ïì»òÒÀÀµÓÚ×é¼þ״̬µÄ´úÂ붼Ӧ¸ÃÔÚʼþÅÉ·¢Ïß³ÌÖÐÖ´ÐС£

¡¡¡¡Õâ¸ö¹æÔò¿ÉÄÜÌýÆðÀ´ÓеãÏÅÈË£¬µ«¶ÔÐí¶à¼òµ¥µÄ³ÌÐòÀ´Ëµ£¬ÄãÓò»×ÅΪÏß³ÌÎÊÌâ²ÙÐÄ¡£ÔÚÎÒÃÇÉîÈëÈçºÎ׫дSwing´úÂë֮ǰ£¬ÈÃÎÒÃÇÏÈÀ´¶¨ÒåÁ½¸öÊõÓ¾ßÏÖ»¯£¨realized£©ºÍʼþÅÉ·¢Ị̈߳¨event-dispatching thread£©¡£

¡¡¡¡¾ßÏÖ»¯µÄÒâ˼ÊÇ×齨µÄpaint()·½·¨ÒѾ­»ò¿ÉÄܻᱻµ÷Óá£Ò»¸ö×÷Ϊ¶¥¼¶´°¿ÚµÄSwing×é¼þµ±µ÷ÓÃÒÔÏ·½·¨Ê±½«±»¾ßÏÖ»¯£º setVisible(true)¡¢show()»ò£¨¿ÉÄÜÁîÄ㾪Æ棩pack()¡£µ±Ò»¸ö´°¿Ú±»¾ßÏÖ»¯£¬Ëü°üº¬µÄËùÓÐ×é¼þ¶¼±»¾ßÏÖ»¯¡£ÁíÒ»¸ö¾ßÏÖ»¯Ò»¸ö×é¼þµÄ·½·¨Êǽ«Ëü·ÅÈëµ½Ò»¸öÒѾ­¾ßÏÖ»¯µÄÈÝÆ÷ÖС£ÉÔºóÄã»á¿´µ½Ò»Ð©¶Ô×é¼þ¾ßÏÖ»¯µÄÀý×Ó¡£

¡¡¡¡Ê¼þÅÉ·¢Ïß³ÌÊÇÖ´ÐлæÖƺÍʼþ´¦ÀíµÄÏ̡߳£ÀýÈ磬paint()ºÍactionPerformed()·½·¨»á×Ô¶¯ÔÚʼþÅÉ·¢Ïß³ÌÖÐÖ´ÐС£ÁíÒ»¸ö½«´úÂë·Åµ½Ê¼þÅÉ·¢Ïß³ÌÖÐÖ´Ðеķ½·¨ÊÇʹÓÃSwingUtilitiesÀàµÄinvokeLater()·½·¨¡£

¡¡¡¡ËùÓпÉÄÜÓ°ÏìÒ»¸öÒѾßÏÖ»¯µÄSwing×é¼þµÄ´úÂ붼±ØÐëÔÚʼþÅÉ·¢Ïß³ÌÖÐÖ´ÐС£µ«Õâ¸ö¹æÔòÓÐһЩÀýÍ⣺

¡¡¡¡ÓÐЩ·½·¨ÊÇḬ̈߳²È«µÄ£ºÔÚSwing APIµÄÎĵµÖУ¬Ḭ̈߳²È«µÄ·½·¨ÓÃÒÔÏÂÎÄ×Ö±ê¼Ç£º

¡¡¡¡This method is thread safe, although most Swing methods are not.
¡¡¡¡£¨Õâ¸ö·½·¨ÊÇḬ̈߳²È«µÄ£¬¾¡¹Ü´ó¶àÊýSwing·½·¨¶¼²»ÊÇ¡££©
Ò»¸öÓ¦ÓóÌÐòµÄGUI³£³£¿ÉÒÔÔÚÖ÷Ïß³ÌÖй¹½¨ºÍÏÔʾ£ºÏÂÃæµÄµäÐÍ´úÂëÊÇ°²È«µÄ£¬Ö»ÒªÃ»ÓУ¨Swing»òÆäËû£©×é¼þ±»¾ßÏÖ»¯£º

public class MyApplication
{
¡¡public static void main(String[] args)
¡¡{
¡¡¡¡JFrame f = new JFrame("Labels"); // ÔÚÕâÀォ¸÷×é¼þ
¡¡¡¡ // ¼ÓÈëµ½Ö÷¿ò¼Ü¡­¡­
¡¡¡¡ f.pack();
¡¡¡¡ f.show();
¡¡¡¡ // ²»ÒªÔÙ×öÈκÎGUI¹¤×÷¡­¡­
¡¡ }
}

¡¡¡¡ÉÏÃæËùʾµÄ´úÂëÈ«²¿ÔÚ¡°main¡±Ïß³ÌÖÐÔËÐС£¶Ôf.pack()µÄµ÷ÓÃʹµÃJFrameÒÔϵÄ×é¼þ¶¼±»¾ßÏÖ»¯¡£ÕâÒâζ×Å£¬f.show() µ÷ÓÃÊDz»°²È«µÄÇÒÓ¦¸ÃÔÚʼþÅÉ·¢Ïß³ÌÖÐÖ´ÐС£¾¡¹ÜÈç´Ë£¬Ö»Òª³ÌÐò»¹Ã»ÓÐÒ»¸ö¿´µÃµ½µÄGUI£¬JFrame»òËüµÄÀïÃæµÄ×é¼þ¾Í¼¸ºõ²»¿ÉÄÜÔÚf.show() ·µ»ØÇ°ÊÕµ½Ò»¸öpaint()µ÷Óá£ÒòΪÔÚf.show()µ÷ÓÃÖ®ºó²»ÔÙÓÐÈκÎGUI´úÂ룬ÓÚÊÇËùÓÐGUI¹¤×÷¶¼´ÓÖ÷Ïß³Ìתµ½ÁËʼþÅÉ·¢Ị̈߳¬Òò´ËÇ°ÃæËùÌÖÂ۵ĴúÂëʵ¼ÊÉÏÊÇḬ̈߳²È«µÄ¡£

¡¡¡¡Ò»¸öappletµÄGUI¿ÉÒÔÔÚinit()·½·¨Öй¹ÔìºÍÏÔʾ£ºÏÖÓеÄä¯ÀÀÆ÷¶¼²»»áÔÚÒ»¸öappletµÄinit()ºÍstart()·½·¨±»µ÷ÓÃÇ°»æÖÆËü¡£Òò¶ø£¬ÔÚÒ»¸öappletµÄinit()·½·¨Öй¹ÔìGUIÊÇ°²È«µÄ£¬Ö»ÒªÄã²»¶ÔappletÖеĶÔÏóµ÷ÓÃshow()»ò setVisible(true)·½·¨¡£

¡¡¡¡ÒªË³±ãÒ»ÌáµÄÊÇ£¬Èç¹ûappletÖÐʹÓÃÁËSwing×é¼þ£¬¾Í±ØÐëʵÏÖΪJAppletµÄ×ÓÀà¡£²¢ÇÒ£¬×é¼þÓ¦¸ÃÌí¼Óµ½µÄJAppletÄÚÈÝ´°¸ñ£¨content pane£©ÖУ¬¶ø²»ÒªÖ±½ÓÌí¼Óµ½JApplet¡£¶ÔÈκÎapplet£¬Ä㶼²»Ó¦¸ÃÔÚinit()»òstart()·½·¨ÖÐÖ´ÐзÑʱµÄ³õʼ»¯²Ù×÷£»¶øÓ¦¸ÃÆô¶¯Ò»¸öÏß³ÌÀ´Ö´ÐзÑʱµÄÈÎÎñ¡£

¡¡¡¡ÏÂÊöJComponent·½·¨ÊÇ°²È«µÄ£¬¿ÉÒÔ´ÓÈκÎÏ̵߳÷Óãºrepaint()¡¢revalidate()¡¢ºÍinvalidate()¡£ repaint()ºÍrevalidate()·½·¨ÎªÊ¼þÅÉ·¢Ï̶߳ÔÇëÇóÅŶӣ¬²¢·Ö±ðµ÷ÓÃpaint()ºÍvalidate()·½·¨¡£ invalidate()·½·¨Ö»ÔÚÐèҪȷÈÏʱ±ê¼ÇÒ»¸ö×é¼þºÍËüµÄËùÓÐÖ±½Ó×æÏÈ¡£

¡¡¡¡¼àÌýÕßÁбí¿ÉÒÔÓÉÈκÎÏß³ÌÐ޸ģºµ÷ÓÃaddListenerTypeListener()ºÍremoveListenerTypeListener()·½·¨×ÜÊÇ°²È«µÄ¡£¶Ô¼àÌýÕßÁбíµÄÌí¼Ó/ɾ³ý²Ù×÷²»»á¶Ô½øÐÐÖеÄʼþÅÉ·¢ÓÐÈκÎÓ°Ïì¡£

¡¡¡¡×¢Ò⣺revalidate()ºÍ¾ÉµÄvalidate()·½·¨Ö®¼äµÄÖØÒªÇø±ðÊÇ£¬revalidate()»á»º´æÇëÇó²¢×éºÏ³ÉÒ»´Îvalidate()µ÷Óá£ÕâºÍrepaint()»º´æ²¢×éºÏ»æÖÆÇëÇóÀàËÆ¡£

¡¡¡¡´ó¶àÊý³õʼ»¯ºóµÄGUI¹¤×÷×ÔÈ»µØ·¢ÉúÔÚʼþÅÉ·¢Ï̡߳£Ò»µ©GUI³ÉΪ¿É¼û£¬´ó¶àÊý³ÌÐò¶¼ÊÇÓÉʼþÇý¶¯µÄ£¬Èç°´Å¥¶¯×÷»òÊó±êµã»÷£¬ÕâЩ×ÜÊÇÔÚʼþÅÉ·¢Ïß³ÌÖд¦ÀíµÄ¡£

¡¡¡¡²»¹ý£¬×ÜÓÐЩ³ÌÐòÐèÒªÔÚGUI³ÉΪ¿É¼ûºóÖ´ÐÐһЩ·ÇʼþÇý¶¯µÄGUI¹¤×÷¡£±ÈÈ磺

¡¡¡¡ÔÚ³ÉΪ¿ÉÓÃÇ°ÐèÒª½øÐг¤Ê±¼ä³õʼ»¯²Ù×÷µÄ³ÌÐò£ºÕâÀà³ÌÐòͨ³£Ó¦¸ÃÔÚ³õʼ»¯ÆÚ¼ä¾ÍÏÔʾ³öGUI£¬È»ºó¸üлò¸Ä±äGUI¡£³õʼ»¯¹ý³Ì²»Ó¦¸ÃÔÚʼþÅÉ·¢Ïß³ÌÖнøÐУ»·ñÔò£¬ÖØ»æ×é¼þºÍʼþÅÉ·¢»áÍ£Ö¹¡£¾¡¹ÜÈç´Ë£¬ÔÚ³õʼ»¯Ö®ºó£¬GUIµÄ¸üÐÂ/¸Ä±ä»¹ÊÇÓ¦¸ÃÔÚʼþÅÉ·¢Ïß³ÌÖнøÐУ¬ÀíÓÉÊÇḬ̈߳²È«¡£

¡¡¡¡±ØÐëÏìÓ¦·ÇAWTʼþÀ´¸üÐÂGUIµÄ³ÌÐò£ºÀýÈ磬ÏëÏóÒ»¸ö·þÎñÆ÷³ÌÐò´Ó¿ÉÄÜÔËÐÐÔÚÆäËû»úÆ÷ÉϵijÌÐòµÃµ½ÇëÇó¡£ÕâЩÇëÇó¿ÉÄÜÔÚÈκÎʱ¿Ìµ½´ï£¬²¢ÇÒ»áÒýÆðÔÚһЩ¿ÉÄÜδ֪µÄÏß³ÌÖжԷþÎñÆ÷µÄ·½·¨µ÷Óá£Õâ¸ö·½·¨µ÷ÓÃÔõÑù¸üÐÂGUIÄØ£¿ÔÚʼþÅÉ·¢Ïß³ÌÖÐÖ´ÐÐGUI¸üдúÂë¡£

¡¡¡¡SwingUtilitiesÀàÌṩÁËÁ½¸ö·½·¨À´°ïÖúÄãÔÚʼþÅÉ·¢Ïß³ÌÖÐÖ´ÐдúÂ룺

¡¡¡¡¡¡invokeLater()£ºÒªÇóÔÚʼþÅÉ·¢Ïß³ÌÖÐÖ´ÐÐijЩ´úÂë¡£Õâ¸ö·½·¨»áÁ¢¼´·µ»Ø£¬²»»áµÈ´ý´úÂëÖ´ÐÐÍê±Ï¡£

¡¡¡¡¡¡invokeAndWait()£ºÐÐΪÓëinvokeLater()ÀàËÆ£¬³ýÁËÕâ¸ö·½·¨»áµÈ´ý´úÂëÖ´ÐÐÍê±Ï¡£Ò»°ãµØ£¬Äã¿ÉÒÔÓÃinvokeLater()À´´úÌæÕâ¸ö·½·¨¡£

¡¡¡¡ÏÂÃæÊÇһЩʹÓÃÕ⼸¸öAPIµÄÀý×Ó¡£Çëͬʱ²ÎÔÄ¡¶The Java Tutorial¡·Öеġ°BINGO example¡±£¬ÓÈÆäÊÇÒÔϼ¸¸öÀࣺCardWindow¡¢ControlPane¡¢PlayerºÍOverallStatusPane¡£
ʹÓÃinvokeLater()·½·¨

¡¡¡¡Äã¿ÉÒÔ´ÓÈκÎÏ̵߳÷ÓÃinvokeLater()·½·¨ÒÔÇëÇóʼþÅÉ·¢Ïß³ÌÔËÐÐÌض¨´úÂë¡£Äã±ØÐë°ÑÒªÔËÐеĴúÂë·Åµ½Ò»¸öRunnable¶ÔÏóµÄ run()·½·¨ÖУ¬²¢½«´ËRunnable¶ÔÏóÉèΪinvokeLater()µÄ²ÎÊý¡£invokeLater()·½·¨»áÁ¢¼´·µ»Ø£¬²»µÈ´ýʼþÅÉ·¢Ïß³ÌÖ´ÐÐÖ¸¶¨´úÂë¡£ÕâÊÇÒ»¸öʹÓÃinvokeLater()·½·¨µÄÀý×Ó£º

Runnable doWorkRunnable = new Runnable()
{
¡¡public void run()
¡¡{
¡¡¡¡doWork();
¡¡ }
};
SwingUtilities.invokeLater(doWorkRunnable);

¡¡¡¡Ê¹ÓÃinvokeAndWait()·½·¨

¡¡¡¡invokeAndWait()·½·¨ºÍinvokeLater()·½·¨ºÜÏàËÆ£¬³ýÁËinvokeAndWait()·½·¨»áµÈʼþÅÉ·¢Ïß³ÌÖ´ÐÐÁËÖ¸¶¨´úÂë²Å·µ»Ø¡£ÔÚ¿ÉÄܵÄÇé¿öÏ£¬ÄãÓ¦¸Ã¾¡Á¿ÓÃinvokeLater()À´´úÌæinvokeAndWait()¡£Èç¹ûÄãÕæµÄҪʹÓà invokeAndWait()£¬ÇëÈ·±£µ÷ÓÃinvokeAndWait()µÄÏ̲߳»»áÔÚµ÷ÓÃÆÚ¼ä³ÖÓÐÈκÎÆäËûÏ߳̿ÉÄÜÐèÒªµÄËø¡£
ÕâÊÇÒ»¸öʹÓÃinvokeAndWait()µÄÀý×Ó£º

void showHelloThereDialog() throws Exception
{
¡¡Runnable showModalDialog = new Runnable()
¡¡{
¡¡¡¡public void run()
¡¡¡¡{
¡¡¡¡¡¡JOptionPane.showMessageDialog( myMainFrame, "Hello There");
¡¡¡¡ }
¡¡ };
¡¡SwingUtilities.invokeAndWait (showModalDialog);
}

¡¡¡¡ÀàËƵأ¬¼ÙÉèÒ»¸öÏß³ÌÐèÒª¶ÔGUIµÄ״̬½øÐдæÈ¡£¬±ÈÈçÎı¾ÓòµÄÄÚÈÝ£¬ËüµÄ´úÂë¿ÉÄÜÀàËÆÕâÑù£º

void printTextField()
¡¡ throws Exception {
¡¡¡¡ final String[] myStrings = new String[2];
¡¡¡¡ Runnable getTextFieldText = new Runnable() {
¡¡¡¡¡¡ public void run() {
¡¡¡¡¡¡¡¡ myStrings[0] = textField0.getText();
¡¡¡¡¡¡¡¡ myStrings[1] = textField1.getText();
¡¡¡¡¡¡ }
¡¡¡¡ };
¡¡¡¡ SwingUtilities.invokeAndWait (getTextFieldText);
¡¡¡¡ System.out.println(myStrings[0] + " " + myStrings[1]);}

¡¡¡¡Èç¹ûÄãÄܱÜÃâʹÓÃỊ̈߳¬×îºÃÕâÑù×ö¡£Ï߳̿ÉÄÜÄÑÓÚʹÓ㬲¢Ê¹µÃ³ÌÐòµÄdebug¸üÀ§ÄÑ¡£Ò»°ãÀ´Ëµ£¬¶ÔÓÚÑϸñÒâÒåϵÄGUI¹¤×÷£¬Ïß³ÌÊDz»±ØÒªµÄ£¬±ÈÈç¶Ô×é¼þÊôÐԵĸüС£

¡¡¡¡²»¹ÜÔõô˵£¬ÓÐʱºòÏß³ÌÊDZØÒªµÄ¡£ÏÂÁÐÇé¿öÊÇʹÓÃÏ̵߳ÄһЩµäÐÍÇé¿ö£º

¡¡¡¡Ö´ÐÐÒ»Ïî·ÑʱµÄÈÎÎñ¶ø²»±Ø½«Ê¼þÅÉ·¢Ïß³ÌËø¶¨¡£Àý×Ó°üÀ¨Ö´ÐдóÁ¿¼ÆËãµÄÇé¿ö£¬»áµ¼Ö´óÁ¿Àà±»×°ÔصÄÇé¿ö£¨Èç³õʼ»¯£©£¬ºÍΪÍøÂç»ò´ÅÅÌI/O¶ø×èÈûµÄÇé¿ö¡£

¡¡¡¡Öظ´µØÖ´ÐÐÒ»Ïî²Ù×÷£¬Í¨³£ÔÚÁ½´Î²Ù×÷¼ä¼ä¸ôÒ»¸öÔ¤¶¨µÄʱ¼äÖÜÆÚ¡£

¡¡¡¡ÒªµÈ´ýÀ´×Ô¿Í»§µÄÏûÏ¢¡£

¡¡¡¡Äã¿ÉÒÔʹÓÃÁ½¸öÀàÀ´°ïÖúÄãʵÏÖỊ̈߳º

¡¡¡¡¡¡SwingWorker£º´´½¨Ò»¸öºǫ́Ïß³ÌÀ´Ö´ÐзÑʱµÄ²Ù×÷¡£

¡¡¡¡¡¡Timer£º´´½¨Ò»¸öÏß³ÌÀ´Ö´Ðлò¶à´ÎÖ´ÐÐijЩ´úÂ룬ÔÚÁ½´ÎÖ´Ðмä¼ä¸ôÓû§¶¨ÒåµÄÑÓ³Ù¡£
ʹÓÃSwingWorkerÀà

¡¡¡¡SwingWorkerÀàÔÚSwingWorker.javaÖÐʵÏÖ£¬Õâ¸öÀಢ²»°üº¬ÔÚJavaµÄÈκη¢ÐаæÖУ¬ËùÒÔÄã±ØÐëµ¥¶ÀÏÂÔØËü¡£

¡¡¡¡SwingWorkerÀà×öÁËËùÓÐʵÏÖÒ»¸öºǫ́Ïß³ÌËùÐèµÄ°¹Ô๤×÷¡£ËäÈ»Ðí¶à³ÌÐò¶¼²»ÐèÒªºǫ́Ị̈߳¬ºǫ́Ïß³ÌÔÚÖ´ÐзÑʱµÄ²Ù×÷ʱÈÔÈ»ÊǺÜÓÐÓõģ¬ËüÄÜÌá¸ß³ÌÐòµÄÐÔÄܹ۸С£

SwingWorker´s get() method. Here´s an example of using SwingWorker:

¡¡¡¡ÒªÊ¹ÓÃSwingWorkerÀ࣬ÄãÊ×ÏÈҪʵÏÖËüµÄÒ»¸ö×ÓÀà¡£ÔÚ×ÓÀàÖУ¬Äã±ØÐëʵÏÖconstruct()·½·¨»¹°üº¬ÄãµÄ³¤Ê±¼ä²Ù×÷¡£µ±ÄãʵÀý»¯SwingWorkerµÄ×ÓÀàʱ£¬SwingWorker´´½¨Ò»¸öÏ̵߳«²¢²»Æô¶¯Ëü¡£ÄãÒªµ÷ÓÃÄãµÄSwingWorker¶ÔÏóµÄstart()·½·¨À´Æô¶¯Ị̈߳¬È»ºóstart()·½·¨»áµ÷ÓÃÄãµÄconstruct()·½·¨¡£µ±ÄãÐèÒªconstruct()·½·¨·µ»ØµÄ¶ÔÏóʱ£¬¿ÉÒÔµ÷Óà SwingWorkerÀàµÄget()·½·¨¡£ÕâÊÇÒ»¸öʹÓÃSwingWorkerÀàµÄÀý×Ó£º

...// ÔÚmain·½·¨ÖУº
final SwingWorker worker = new SwingWorker() {
¡¡public Object construct() {
¡¡¡¡return new expensiveDialogComponent();
¡¡ }
};
worker.start();
...
// ÔÚ¶¯×÷ʼþ´¦Àí·½·¨ÖÐ:
JOptionPane.showMessageDialog (f, worker.get());

¡¡¡¡µ±³ÌÐòµÄmain()·½·¨µ÷ÓÃstart()·½·¨£¬SwingWorkerÆô¶¯Ò»¸öеÄÏß³ÌÀ´ÊµÀý»¯ExpensiveDialogComponent¡£main()·½·¨»¹¹¹ÔìÁËÓÉÒ»¸ö´°¿ÚºÍÒ»¸ö°´Å¥×é³ÉµÄGUI¡£

¡¡¡¡µ±Óû§µã»÷°´Å¥£¬³ÌÐò½«×èÈû£¬Èç¹û±ØÒª£¬×èÈûµ½ExpensiveDialogComponent´´½¨Íê³É¡£È»ºó³ÌÐòÏÔʾһ¸ö°üº¬ExpensiveDialogComponentµÄģʽ¶Ô»°¿ò¡£Äã¿ÉÒÔÔÚMyApplication.javaÕÒµ½Õû¸ö³ÌÐò¡£

¡¡¡¡Ê¹ÓÃTimerÀà

¡¡¡¡TimerÀàͨ¹ýÒ»¸öActionListenerÀ´Ö´Ðлò¶à´ÎÖ´ÐÐÒ»Ïî²Ù×÷¡£Äã´´½¨¶¨Ê±Æ÷µÄʱºò¿ÉÒÔÖ¸¶¨²Ù×÷Ö´ÐеÄƵÂÊ£¬²¢ÇÒÄã¿ÉÒÔÖ¸¶¨¶¨Ê±Æ÷µÄ¶¯×÷ʼþµÄ¼àÌýÕߣ¨action listener£©¡£Æô¶¯¶¨Ê±Æ÷ºó£¬¶¯×÷¼àÌýÕßµÄactionPerformed()·½·¨»á±»£¨¶à´Î£©µ÷ÓÃÀ´Ö´ÐвÙ×÷¡£

¡¡¡¡¶¨Ê±Æ÷¶¯×÷¼àÌýÕߣ¨action listener£©¶¨ÒåµÄactionPerformed()·½·¨½«ÔÚʼþÅÉ·¢Ïß³ÌÖе÷Óá£ÕâÒâζ×ÅÄã²»±ØÔÚÆäÖÐʹÓÃinvokeLater()·½·¨¡£

¡¡¡¡ÕâÊÇÒ»¸öʹÓÃTimerÀàÀ´ÊµÏÖ¶¯»­Ñ­»·µÄÀý×Ó£º

public class AnimatorApplicationTimer
¡¡extends JFrame implements ActionListener {
¡¡¡¡...//ÔÚÕâÀﶨÒåʵÀý±äÁ¿
¡¡¡¡Timer timer;
¡¡¡¡public AnimatorApplicationTimer(...) {
¡¡¡¡¡¡... // ´´½¨Ò»¸ö¶¨Ê±Æ÷À´
¡¡¡¡¡¡// À´µ÷Óô˶ÔÏóaction handler¡£
¡¡¡¡¡¡timer = new Timer(delay, this);
¡¡¡¡¡¡timer.setInitialDelay(0);
¡¡¡¡¡¡timer.setCoalesce(true);
¡¡¡¡¡¡...
¡¡¡¡}
¡¡¡¡public void startAnimation() {
¡¡¡¡¡¡if (frozen) {
¡¡¡¡¡¡¡¡// ʲô¶¼²»×ö¡£Ó¦Óû§ÒªÇó
¡¡¡¡¡¡¡¡// Í£Ö¹±ä»»Í¼Ïñ¡£
¡¡¡¡¡¡} else {
¡¡¡¡¡¡¡¡// Æô¶¯£¨»òÖØÆô¶¯£©¶¯»­£¡
¡¡¡¡¡¡¡¡timer.start();
¡¡¡¡¡¡}
¡¡¡¡}
¡¡¡¡public void stopAnimation() {
¡¡¡¡¡¡// Í£Ö¹¶¯»­Ï̡߳£
¡¡¡¡¡¡timer.stop();
¡¡¡¡}
¡¡¡¡public void actionPerformed (ActionEvent e)
¡¡¡¡{
¡¡¡¡¡¡// ½øµ½ÏÂÒ»Ö¡¶¯»­¡£
¡¡¡¡¡¡frameNumber++;
¡¡¡¡¡¡// ÏÔʾ¡£
¡¡¡¡¡¡repaint();
¡¡¡¡}
¡¡ ...
}
ÔÚÒ»¸öÏß³ÌÖÐÖ´ÐÐËùÓеÄÓû§½çÃæ´úÂëÓÐÕâÑùһЩÓŵ㣺

¡¡¡¡×é¼þ¿ª·¢Õß²»±Ø¶ÔÏ̱߳à³ÌÓÐÉîÈëµÄÀí½â£ºÏñViewPointºÍTrestleÕâÀ๤¾ß°üÖеÄËùÓÐ×é¼þ¶¼±ØÐëÍêÈ«Ö§³Ö¶àÏ̷߳ÃÎÊ£¬Ê¹µÃÀ©Õ¹·Ç³£À§ÄÑ£¬ÓÈÆä¶Ô²»¾«Í¨Ï̱߳à³ÌµÄ¿ª·¢ÕßÀ´Ëµ¡£×î½üµÄһЩ¹¤¾ß°üÈçSubArcticºÍIFC£¬¶¼²ÉÓúÍSwingÀàËƵÄÉè¼Æ¡£

¡¡¡¡Ê¼þÒÔ¿ÉÔ¤ÖªµÄ´ÎÐòÅÉ·¢£ºinvokeLater()ÅŶӵÄrunnable¶ÔÏó´ÓÊó±êºÍ¼üÅÌʼþ¡¢¶¨Ê±Æ÷ʼþ¡¢»æÖÆÇëÇóµÄͬһ¸ö¶ÓÁÐÅÉ·¢¡£ÔÚһЩ×é¼þÍêÈ«Ö§³Ö¶àÏ̷߳ÃÎʵŤ¾ß°üÖУ¬×é¼þµÄ¸Ä±ä±»±ä»¯ÎÞ³£µÄÏ̵߳÷¶È³ÌÐò´©²åµ½Ê¼þ´¦Àí¹ý³ÌÖС£ÕâʹµÃÈ«Ãæ²âÊÔ±äµÃÀ§ÄÑÉõÖÁ²»¿ÉÄÜ¡£

¡¡¡¡¸üµÍµÄ´ú¼Û£º³¢ÊÔСÐÄËøסÁÙ½çÇøµÄ¹¤¾ß°üÒª»¨·Ñʵ×ãµÄʱ¼äºÍ¿Õ¼äÔÚËøµÄ¹ÜÀíÉÏ¡£Ã¿µ±¹¤¾ß°üÖе÷ÓÃij¸ö¿ÉÄÜÔÚ¿Í»§´úÂëÖÐʵÏֵķ½·¨Ê±£¨Èç publicÀàÖеÄÈκÎpublicºÍprotected·½·¨£©£¬¹¤¾ß°ü¶¼Òª±£´æËüµÄ״̬²¢ÊÍ·ÅËùÓÐËø£¬ÒÔ±ã¿Í»§´úÂëÄÜÔÚ±ØҪʱ»ñµÃËø¡£µ±¿ØÖÆȨ½»»Øµ½¹¤¾ß°ü£¬¹¤¾ß°üÓÖ±ØÐëÖØÐÂץסËüµÄËø²¢»Ö¸´×´Ì¬¡£ËùÓÐÓ¦ÓóÌÐò¶¼²»µÃ²»¸ºµ£ÕâÒ»´ú¼Û£¬¼´Ê¹´ó¶àÊýÓ¦ÓóÌÐò²¢²»ÐèÒª¶ÔGUIµÄ²¢·¢·ÃÎÊ¡£

¡¡¡¡ÕâÊǵÄSubArctic Java ToolkitµÄ×÷Õ߶ÔÔÚ¹¤¾ß°üÖÐÖ§³Ö¶àÏ̷߳ÃÎʵÄÎÊÌâµÄÃèÊö£º

¡¡¡¡ÎÒÃǵĻù±¾ÐÅÌõÊÇ£¬µ±Éè¼ÆºÍ½¨Ôì¶àÏß³ÌÓ¦ÓóÌÐò£¬ÓÈÆäÊÇÄÇЩ°üÀ¨GUI×é¼þµÄÓ¦ÓóÌÐòʱ£¬±ØÐë±£Ö¤¼«¶ËСÐÄ¡£Ï̵߳ÄʹÓÿÉÄÜ»áºÜÓÐÆÛÆ­ÐÔ¡£ÔÚÐí¶àÇé¿öÏ£¬ËüÃDZíÏÖµÃÄܹ»¼«ºÃµÄ¼ò»¯±à³É£¬Ê¹µÃÉè¼Æ¡°×¨×¢ÓÚµ¥Ò»ÈÎÎñµÄ¼òµ¥×ÔÖÎʵÌ塱³ÉΪ¿ÉÄÜ¡£ÔÚһЩÇé¿öÏÂËüÃǵÄÈ·¼ò»¯ÁËÉè¼ÆºÍ±àÂ롣Ȼ¶ø£¬ÔÚ¼¸ºõËùÓеÄÇé¿öÏ£¬ËüÃǶ¼Ê¹µÃµ÷ÊÔ¡¢²âÊÔºÍά»¤µÄÀ§ÄÑ´ó´óÔö¼ÓÉõÖÁ³ÉΪ²»¿ÉÄÜ¡£ÎÞÂÛ´ó¶àÊý³ÌÐòÔ±ËùÊܵÄѵÁ·¡¢ËûÃǵľ­ÑéºÍʵ¼ù£¬»¹ÊÇÎÒÃÇÓÃÀ´°ïÖú×Ô¼ºµÄ¹¤¾ß£¬¶¼²»ÊÇÄܹ»ÓÃÀ´¶Ô¸¶·Ç¾ö¶¨Â۵ġ£ÀýÈ磬ȫÃæ²âÊÔ£¨Õâ×ÜÊÇÀ§Äѵģ©ÔÚbugÒÀÀµÓÚʱ¼äʱÊǼ¸ºõ²»¿ÉÄܵġ£ÓÈÆä¶ÔÓÚJavaÀ´Ëµ£¬Ò»¸ö³ÌÐòÒªÔËÐÐÔÚÐí¶à²»Í¬ÀàÐ͵ĻúÆ÷µÄ²Ù×÷ϵͳƽ̨ÉÏ£¬²¢ÇÒÿ¸ö³ÌÐò¶¼±ØÐëÔÚÇÀÏȺͷÇÇÀÏÈʽµ÷¶È϶¼ÄÜÕý³£¹¤×÷¡£

¡¡¡¡ÓÉÓÚÕâЩ¹ÌÓеÄÀ§ÄÑ£¬ÎÒÃÇÁ¦È°ÄãÈý˼ÊÇ·ñ¾ø¶ÔÓÐʹÓÃÏ̵߳ıØÒª¡£¾¡¹ÜÈç´Ë£¬ÓÐЩÇé¿öÏÂʹÓÃÏß³ÌÊDZØÒªµÄ£¨»òÕßÊDZ»ÆäËûÈí¼þ°üÇ¿¼ÓµÄ£©£¬ËùÒÔsubArcticÌṩÁËÒ»¸öḬ̈߳²È«µÄ·ÃÎÊ»úÖÆ¡£±¾ÕÂÌÖÂÛÁËÕâÒ»»úÖƺÍÔõÑùÔÚÒ»¸ö¶ÀÁ¢Ïß³ÌÖа²È«µØ²Ù×÷½»»¥Ê÷¡£

¡¡¡¡ËûÃÇËù˵µÄḬ̈߳²È«»úÖƷdz£ÀàËÆÓÚSwingUtilitiesÀàÌṩµÄinvokeLater()ºÍinvokeAndWait()·½·¨¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ