前言:啊哈,回到學校就是出效率啊~不過又想著去複習,但是坐到電腦前面又開始看程式了,沒辦法,命啊……近日在弄個聊天軟體,不是要登陸的麼。想給登陸的介面做個CardLayout,可是問題出來了。現在單獨拿出來貼幾個圖記錄下下。
基本的JFrame的顯示程式:
import java.awt.*;
import javax.swing.*;
class Demo ...{
public static void main(String[] args) ...{
CardLayout card = new CardLayout();
JFrame frame = new JFrame ("CardLayout 布局測試");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
JLabel label1 = new JLabel("lable1");
JLabel label2 = new JLabel("label2");
frame.setLayout (card);
frame.add (label1, "l1");
frame.add (label2, "l2");
frame.setSize(100, 100);
Container con = frame.getContentPane ();
card.show (con, "l2");
frame.setVisible (true);
}
}
這個介面我就不貼了,看了皮膚不是很舒服……來看下程式中的card的show上面的那個Container,或者式show的第一個參數con。本來我的程式不是這麼寫的,那句建立Container是沒有的,可是如果第一個參數放frame的話,編譯是能通過,不過會丟出Exception:
一看是wrong parent for CardLayout,看來是CardLayout.show(parent, String)這個參數有問題。看了下JDK,這個show是這樣的show (Container, String),那也就是說前面這個參數是Container的咯!!再看個類的繼承樹:
看到了吧,JFrame的爸爸的爸爸的爸爸,也就是爺爺的爸爸是java.awt.Container!也就是說JFrame是一種Container。為什麼這裡放置屬於Container的JFrame就不行呢?人能吃飯,男人、女人屬於人,能吃飯。太監是男人的繼承子類,能吃飯,但是沒嘴巴的太監是太監的繼承子類,雖然都是人,但是唯獨他/她/它不能吃飯,因為沒嘴巴。轉念一想,JFrame不是有個getContentPane()的Method麼,本來就是屬於Container的何必調用這個呢。既然多了這個方法,肯定不可能是return this的!通過一個不嚴謹的例子好像也證明不了什麼,但是看到很多程式中對JFrame的操作,大多調用一個getContentPane()後對這個Container做手腳,開始不明白,直接調用這個this就可以辦到的事情為什麼要多此一舉,原來在這裡等著我那。也是,swing和AWT本來就是那種剪不斷理還亂的關係,搞不好趁早SWT去……