java 板


LINE

(原文恕刪) 首先, 你應該繼承 JComponent或其子類, 然後覆寫(Override) paintComponent(Graphics g), 而非 paint(Graphics g). 因為, 從 swing類別開始 JComponent或其子類才有內建雙緩衝(double buffering) 機制, 而它們的 paint會轉呼叫 paintComponent, 所以若無特殊原因 都應該覆寫 paintComponent才對. 重畫(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()都最後才執行. 所以這意味著: 畫圖時, 參數更新要寫在 paintComponent中, 若不這樣做, 會造成參數更新後才畫圖這種錯誤. 然後不想有間隙, 就得用drawLine()的方式. 按第一下取得起始位置, 拖曳取得第二個位置, 畫線. 第二個位置當作起始位置, 再拖曳取得第二個位置, 畫線. 如此連綿不斷就不會有間隙產生. 當視窗最小化(deminimized)或調整尺寸(resized)後, 重現剛才畫的圖案 這必須宣告一個 ArrayList物件,記住拖曳過的每個 Point. 當視窗經過上述變化, 作業系統會自動觸發 paintComponent, 所以用個迴圈把 ArrayList的 Point取出畫回, 即大功告成. 以下是範例: import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.event.MouseInputListener; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseEvent; import java.util.ArrayList; class DrawPanel extends JPanel implements MouseInputListener{ ArrayList point; //:紀錄每個點 public DrawPanel() { this.addMouseListener(this);; this.addMouseMotionListener(this); point = new ArrayList(); } @Override public void paintComponent(Graphics g) { paintLine(g); } private void paintLine(Graphics g) { final Point A_BREAK = new Point(-1,-1); for(int i = 0; i < point.size()-1; i++) { //:重畫出每個點 Point p1 = (Point)point.get(i); Point p2 = (Point)point.get(i+1); if(p1.equals(A_BREAK) || p2.equals(A_BREAK)) { //:碰到中斷點跳開不畫 continue; } else { g.drawLine(p1.x, p1.y, p2.x, p2.y); } } } //--------[ implements MouseInputListener @Override public void mousePressed(MouseEvent e) { point.add( new Point(e.getX(), e.getY()) ); } @Override public void mouseDragged(MouseEvent e) { point.add( new Point(e.getX(), e.getY()) ); repaint(); } @Override public void mouseReleased(MouseEvent e) { point.add( new Point(-1, -1) ); //: 表示作畫中斷 } @Override public void mouseClicked(MouseEvent e) {} @Override public void mouseEntered(MouseEvent e) {} @Override public void mouseExited(MouseEvent e) {} @Override public void mouseMoved(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 DrawPanel()); } } --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.64.74 ※ 編輯: the2046 來自: 220.135.64.74 (07/07 13:09)







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燈, 水草

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

TOP