1. 程式人生 > >《JFrame類中paint()方法的重繪》

《JFrame類中paint()方法的重繪》

我之前一直比較模糊的地方,吸納看以下程式碼(錯誤,其實也不能算是錯誤。就是小毛病)
import javax.swing.JFrame;
/**
 *寫這個類主要是想實現窗體的自動繪製
 */
public class MyFrame extends JFrame{
public void showFrame(){
//建立JFrame物件
JFrame frame = new JFrame();

//設定視窗大小
frame.setSize(500,500);

//設定視窗位置
frame.setLocation(300,100);

//設定視窗大小固定不變
frame.setResizable(false);

//設定視窗關閉時,程式停止執行
frame.setDefaultCloseOperation(3);

//是指視窗可視
frame.setVisible(true);
}
public void paint(Graphics g){
super.paint(g);
g.drawLine(100,100,400,400);
}
public static void main(String[] args){
new MyFrame().showFrame();
}
}


很明顯,當執行時,沒有出現自動繪製的那條線。原因只有一個。當MyFrame類繼承JFrame類時,MyFrame本身就是一個窗體類,當建立MyFrame類物件時,就等於建立了一個窗體。方法paint()把線畫到new MYFrame()上,當呼叫showFrame()方法時,JFrame又建立一個新窗體,把前一個給覆蓋掉了(也不算是覆蓋,因為建立MyFrame物件時,視窗沒有設定可視,而paint()方法卻是在MyFrame上畫的,而不是在JFrame建立的窗體上繪製的),所以就不會出現那條線。




先面是改動後的方法,兩種都可以,但第一種就顯得多餘了(因為都要繼承JFrame,所以就可以省略建立JFrame物件) 


一、
import javax.swing.JFrame;
/**
 *實現窗體的自動繪製
 */
public class MyFrame extends JFrame{
public void showFrame(){
//建立JFrame物件
JFrame frame = new JFrame(){
public void paint(Graphics g){
super.paint(g);
g.drawLine(100,100,400,400);
}
};

//設定視窗大小
frame.setSize(500,500);

//設定視窗位置
frame.setLocation(300,100);

//設定視窗大小固定不變
frame.setResizable(false);

//設定視窗關閉時,程式停止執行
frame.setDefaultCloseOperation(3);

//是指視窗可視
frame.setVisible(true);
}

public static void main(String[] args){
new MyFrame().showFrame();
}
}


二、
import javax.swing.JFrame;
/**
 *實現窗體的自動繪製
 */
public class MyFrame extends JFrame{
public void showFrame(){
//設定視窗大小
this.setSize(500,500);

//設定視窗位置
this.setLocation(300,100);

//設定視窗大小固定不變
this.setResizable(false);

//設定視窗關閉時,程式停止執行
this.setDefaultCloseOperation(3);

//是指視窗可視
this.setVisible(true);
}

public void paint(Graphics g){
super.paint(g);
g.drawLine(100,100,400,400);
}

public static void main(String[] args){
new MyFrame().showFrame();
}
}