这段java代码不明白啊
方法可能是这样的
public Container getContentPane(){
//在这里new了一个 Container c= new Container()
//实现代码 ........
return c;
}
这样在外面就不用再new一次了
这个我们可以分析下源码,首先来看下构造函数:
public JFrame(String title) throws HeadlessException {
super(title);
frameInit();
}
在构造函数中调用了frameInit()方法,那么我们再来看下这个方法的实现:
protected void frameInit() {
enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);
setLocale( JComponent.getDefaultLocale() );
setRootPane(createRootPane());
setBackground(UIManager.getColor("control"));
setRootPaneCheckingEnabled(true);
if (JFrame.isDefaultLookAndFeelDecorated()) {
boolean supportsWindowDecorations =
UIManager.getLookAndFeel().getSupportsWindowDecorations();
if (supportsWindowDecorations) {
setUndecorated(true);
getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
}
}
sun.awt.SunToolkit.checkAndSetPolicy(this, true);
}
请注意,在这个方法中setRootPane(createRootPane());调用了createRootPane(),new了一个JRootPane对象。我们再来看下JFrame类中的getContentPane()方法
public Container getContentPane() {
return getRootPane().getContentPane();
}
看到了吗?天啊,它调用了JRootPane对象的getContentPane()方法。哦,好吧,那让我们再看看JRootPane的构造方法做了什么:
public JRootPane() {
setGlassPane(createGlassPane());
setLayeredPane(createLayeredPane());
setContentPane(createContentPane());
setLayout(createRootLayout());
setDoubleBuffered(true);
updateUI();
}
噢,发现了么,在这个该死的构造方法发生了什么?它使用了setContentPane( createContentPane())方法初始化了ContentPane,它使用了createContentPane()创建了ContentPane。oh, god, 让我们来看看吧,这个createContentPane()背着我们都做了什么勾当:
protected Container createContentPane() {
JComponent c = new JPanel();
c.setName(this.getName()+".contentPane");
c.setLayout(new BorderLayout() {
/* This BorderLayout subclass maps a null constraint to CENTER.
* Although the reference BorderLayout also does this, some VMs
* throw an IllegalArgumentException.
*/
public void addLayoutComponent(Component comp, Object constraints) {
if (constraints == null) {
constraints = BorderLayout.CENTER;
}
super.addLayoutComponent(comp, constraints);
}
});
return c;
}
看到了么,看到了么,它new 了一个JComponent,这个该死的JComponent就是Container的子类。
哦,好吧,让我们再回想下这个过程,new JFrame()的时候创建了JRootPane,而在new JRootPane的时候又创建JComponent。看到了么,其实就是他妈的这么回事儿。
2013-07-30
广告 您可能关注的内容 |