java 板


LINE

※ 引述《the2046 (wz)》之銘言: : 重畫(repaint)是一件很耗時的工作, 所以它執行的優先權(priority)是最低的. : 它必需讓其他指令先執行, 它才能執行. 例如: : import javax.swing.*; : import javax.swing.event.MouseInputListener; : import java.awt.Graphics; : import java.awt.event.MouseEvent; : class TeachPanel extends JPanel implements MouseInputListener{ : public TeachPanel() { : this.addMouseListener(this); : this.addMouseMotionListener(this); : } : @Override : public void paintComponent(Graphics g) { : System.out.println("paint done"); : System.out.println("----------------"); : } : public void t() { : System.out.println("t done1"); : System.out.println("t done2"); : } : //--------[ implements MouseInputListener : @Override : public void mouseDragged(MouseEvent e) { : System.out.println("drag done1"); : repaint(); : System.out.println("drag done2"); : System.out.println("drag done3"); : System.out.println("drag done4"); : t(); : } : @Override public void mouseClicked(MouseEvent e) {} : @Override public void mouseEntered(MouseEvent e) {} : @Override public void mouseExited(MouseEvent e) {} : @Override public void mouseMoved(MouseEvent e) {} : @Override public void mousePressed(MouseEvent e) {} : @Override public void mouseReleased(MouseEvent e) {} : //--------] implements MouseInputListener : public static void main(String[] args) { : JFrame jf = new JFrame(); : jf.setSize(500, 500); : jf.setVisible(true); : jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); : jf.setContentPane(new TeachPanel()); : } : } : 輸出結果: : paint done : ---------------- : drag done1 : drag done2 : drag done3 : drag done4 : t done1 : t done2 : paint done : ---------------- : 螢幕初始化時, 系統會自動調用 paintComponent一次, : 但隨後 repaint()都最後才執行. 會得到這樣的結果主因是 repaint method 本身是 asynchronous operation,它 會造成(觸發) UI 組件的 paint routine 在某個時刻執行(在 event-dispatching thread),精確地說是 repaint 會 enqueue PaintEvent 到 EDT,造成 paint method 的執行。 因為 mouseDragged method 本身是執行在 EDT 裡,那麼 repaint method 所安排 的 PaintEvent 必定會在 mouseDragged 執行完之後才被處理,於是 paint method 的執行是在 mouseDragged 執行完畢之後,然 mouseDragged method 執行過程裡, repaint method 被執行的時機則是依照其在 mouseDragged method 裡出現的順序, 換句話說,repaint method 執行的時間點定在 t method 之前。 試著把 mouseDragged method 裡的所有 statemenets 打包到一個 Runnable object 丟到另一個 thread 來執行,你多少可以觀察到 paint method 的執行不是落在最後 的情況。 @Override public void mouseDragged(MouseEvent e) { new Thread(new Runnable() { public void run() { System.out.println("drag done1"); repaint(); System.out.println("drag done2"); System.out.println("drag done3"); System.out.println("drag done4"); t(); } }).start(); } --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.81.225







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP