成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談EventQueue in Swing

開發 后端
本文介紹EventQueue in Swing,包括介紹為什么Modal Dialog(Frame)彈出的時候界面不會死和為什么界面會死掉等。

最近在看多線程的東西,EventQueue in Swing負責所有AWTEvent(以及其子類)的分發,以后如果要定義自己的ProgressBar可能會用到,先記下來。

EventQueue in Swing簡單工作原理

簡單來講,在EventQueue中有一個dispatchThread,這是一個線程類,負責事件的分發,當Queue中有事件的時候,它會摘取前面的事件并分發給相應的對象進行處理,等處理完之后再獲取下一個,當Queue中沒有事件的時候,線程等待。

當有事件觸發時,系統會調用EventQueue的push方法將AWTEvent添加到EventQueue的最后,同時喚醒dispatchThread。

為什么界面會死掉

所以可以看到,Swing的事件分發實際上是同步的,并且都是在dispatchThread這個線程中處理的,也就是說是一個事件一個事件處理的,如果有某一個事件處理的時間非常長的時侯,其他事件就會被堵塞在那里,從現象上看得話,就是界面會死掉,如果界面被其他窗口覆蓋之后再回到前面的時侯,會變成一片灰色,這是因為PaintEvent被堵塞而不能被分發出去的緣故。

為什么Modal Dialog(Frame)彈出的時候界面不會死

當在處理事件的時侯如果彈出一個Modal Dialog,那么處理方法會停在那里并等待Modal Dialog銷毀,這個時候按照上面的分析,dispatchThread也會停在那里,這樣的話其他事件也不會被分發,那么界面也應該會死掉才對。實際上在等待Modal Dialog銷毀的過程中,如果能夠保證事件可以順利地分發出去的話,界面當然就不會死。先來看這個例子。

  1. packageeventqueue;  
  2.  
  3. importjava.awt.AWTEvent;  
  4. importjava.awt.ActiveEvent;  
  5. importjava.awt.Component;  
  6. importjava.awt.EventQueue;  
  7. importjava.awt.MenuComponent;  
  8. importjava.awt.event.ActionEvent;  
  9. importjava.awt.event.ActionListener;  
  10.  
  11. importjavax.swing.JButton;  
  12. importjavax.swing.JDialog;  
  13.  
  14. publicclassTestEvent{  
  15. publicstaticvoidmain(String[]args){  
  16. finalJDialogdlg=newJDialog();  
  17. dlg.setTitle("TestEventQueue");  
  18. JButtonbtn=newJButton("Test");  
  19. dlg.getContentPane().add(btn);  
  20. btn.addActionListener(newActionListener(){  
  21. publicvoidactionPerformed(ActionEvente){  
  22. longnow=System.currentTimeMillis();  
  23. EventQueuetheQueue=dlg.getToolkit().getSystemEventQueue();  
  24. System.out.println("atleast5000millis");  
  25. while(System.currentTimeMillis()-now<5000l){  
  26. try{  
  27. //ThisisessentiallythebodyofEventDispatchThread  
  28. AWTEventevent=theQueue.getNextEvent();  
  29. Objectsrc=event.getSource();  
  30. if(eventinstanceofActiveEvent){  
  31. ((ActiveEvent)event).dispatch();  
  32. }elseif(srcinstanceofComponent){  
  33. ((Component)src).dispatchEvent(event);  
  34. }elseif(srcinstanceofMenuComponent){  
  35. ((MenuComponent)src).dispatchEvent(event);  
  36. }  
  37. }catch(Exceptionex){  
  38. ex.printStackTrace();  
  39. }  
  40. }  
  41. System.out.println("end");  
  42. }  
  43. });  
  44. dlg.pack();  
  45. dlg.show();  
  46. }  
  47. }  
  48.  

在上面Swing的例子中,當Button的Action被觸發,actionPerformed方法執行的時候,會首先幫助EventQueue分發事件,直到最少5秒之后返回,這時可以看到這個事件處理方法至少執行了5秒鐘,但是在這個過程中Dialog仍然可以正常工作,只是因為在這5秒之中并非是Sleep,而是在幫助EventQueue分發事件,如果代碼改成
Thread.sleep(5000);
的話,界面將會死掉。

所以在Modal Dialog彈出的時候,實際上只要在show方法中能夠實現類似上面的代碼,保證事件可以正常的分發(同時截獲父窗口的一些事件,過濾掉一些觸發Action的事件),那么父窗口的界面就不會死掉。

當事件處理方法很長時間才能做完該怎么辦

當事件處理方法需要很長時間才能執行完的話,如果需要保證界面不死的話,還是只能用多線程,雖然上面的方法實現了事件處理的時候界面不死,但是這和一般的事件處理是有不同的,上面的方法實際上在處理的時候什么都沒有做,而我們一般需要有自己的操作(比如訪問數據庫,訪問網絡,讀寫操作等需要很長時間才能處理完的工作),不可能做到一邊在操作一邊處理Event分發,這個時候只有新建一個線程才是正道。

不過關于很多EventQueue in Swing和EventDispatchThread的方法都被封裝在其實現里面,對外不可視,導致不可能對其進行一些修改,有點不爽。另外在EventQueue中的AWTEvent一般都是給最上層對象的,比如最上層的JDialog或者JFrame,然后由JDialog或者JFrame分發給其他的Component,不過我不知道怎么可以從AWTEvent事件找到真正的擁有者,這一點比較郁悶

【編輯推薦】

  1. 在表格中Swing增加列表框
  2. 淺談Swing控件JList
  3. 概述Swing組件與外部線程
  4. Java Swing做什么好
  5. Swing文件選擇器的制作
責任編輯:佚名 來源: 博客園
相關推薦

2009-07-17 12:44:01

NetBeans開發S

2009-07-16 12:58:50

Swing控件

2009-07-14 18:28:58

Swing入門

2009-07-15 13:06:38

Swing組件

2009-07-15 14:29:24

構造JListSwing

2009-07-10 11:07:18

Swing和SWT

2009-07-10 17:20:38

Swing構件AWT構件

2009-07-14 14:50:00

JOptionPane

2009-07-17 16:49:18

lookandfeelSwing

2009-07-16 16:23:59

Swing線程

2009-07-15 09:59:11

Metal觀感Swing

2009-07-10 13:09:53

.Net與Java S

2009-07-15 16:29:41

Swing繪畫

2009-07-14 11:08:42

WebRendererSwing應用程序

2009-07-14 17:01:29

Look&FeelSwing

2009-07-16 10:26:49

渲染器接口Swing

2009-07-10 11:31:45

Swing支持透明和不規則窗口

2009-07-14 17:38:20

Swing模式

2009-07-17 15:34:37

Java Swing連接數據庫

2009-07-16 08:53:03

Swing任務Swing線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97影院2 | 欧美片网站免费 | 色综合成人网 | 久草新在线 | 国产精品高清一区二区三区 | 在线国产一区 | 成人久草| 国产精彩视频在线观看 | 国产成人免费网站 | 国产精品久久久久久模特 | 中文字幕亚洲视频 | 国产又色又爽又黄又免费 | 国产一级片免费在线观看 | 国产精品久久久久久久久久久久午夜片 | 成人av在线播放 | 色婷婷av99xx | 亚洲精品视频免费看 | 精品国产不卡一区二区三区 | 欧美日韩一区二区在线观看 | 91夜夜夜 | 在线a视频网站 | 国产精品久久久久久久久久久久 | 国产一区二区三区不卡av | 成人激情视频网 | 草比av| 精品国产乱码一区二区三 | 亚洲视频www | 国产成人免费视频网站高清观看视频 | 91在线观看 | 日韩手机视频 | 99久久国产综合精品麻豆 | 91网视频 | 久久一区视频 | 成人在线视频看看 | 正在播放国产精品 | 日本一区二区高清视频 | 在线播放第一页 | 一级片在线播放 | 丝袜美腿一区 | 视频在线一区二区 | 免费观看色 |