JFrame.paint(Graghics g) 方法重繪 視窗透明 解決方法
阿新 • • 發佈:2019-02-16
我們知道,Java中每次重繪都會呼叫paint方法。
publicvoid paint(Graphics g) {
//super.paint(g);
Color c = g.getColor();
g.setColor(new Color(50,150,50));
g.fillOval(tankPos.x, tankPos.y, tankWid, tankHei);
g.setColor(c);
} 如果使用awt包裡面的Frame類來構建視窗的話,上面的方法沒有問題,但如果用他的子類swing裡的JFrame的話,每次重繪,只是重繪視窗邊框和paint方法裡的東西,視窗的背景並沒有被繪製出來,所以會看到窗口裡顯示的是下一層窗口裡要顯示的東西,是“透明”的。而且,如果你寫的程式是動畫效果時,repaint後上一幀的影象不會自動被清除,而是跟下一幀影象重疊。也就說明他的父類物件Frame可以完成工作(重新整理螢幕)沒有做。
所以,我們要先呼叫其父物件也就是java.awt.Frame的paint方法,
super.paint(Graphics g);
這樣就OK了.
或者,我們也可以手工在paint里加上重新整理螢幕的程式碼:
g.setColor(this.getBackground());
g.fillRect(0, 0, 視窗寬,視窗高);
//super.paint(g);
Color c = g.getColor();
g.setColor(new Color(50,150,50));
g.fillOval(tankPos.x, tankPos.y, tankWid, tankHei);
g.setColor(c);
} 如果使用awt包裡面的Frame類來構建視窗的話,上面的方法沒有問題,但如果用他的子類swing裡的JFrame的話,每次重繪,只是重繪視窗邊框和paint方法裡的東西,視窗的背景並沒有被繪製出來,所以會看到窗口裡顯示的是下一層窗口裡要顯示的東西,是“透明”的。而且,如果你寫的程式是動畫效果時,repaint後上一幀的影象不會自動被清除,而是跟下一幀影象重疊。也就說明他的父類物件Frame可以完成工作(重新整理螢幕)沒有做。
所以,我們要先呼叫其父物件也就是java.awt.Frame的paint方法,
super.paint(Graphics g);
這樣就OK了.
或者,我們也可以手工在paint里加上重新整理螢幕的程式碼:
g.setColor(this.getBackground());
g.fillRect(0, 0, 視窗寬,視窗高);