《JFrame類中paint()方法的重繪》
阿新 • • 發佈:2019-02-02
我之前一直比較模糊的地方,吸納看以下程式碼(錯誤,其實也不能算是錯誤。就是小毛病)
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();
}
}
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();
}
}