我是java新手,在阅读时我遇到了各种框架和面板,JFrame,JLayeredPane,JRootPane和JPannel之间的混淆是什么,它们之间的差异是可以在单个类中同时使用JFrame和JPanel.
看看这里的图片
一些细节
官方Swing教程非常好地总结了设计.
让我们做一个最小的例子:
import javax.swing.JFrame;
public class SomeFrame {
public static void main(String [] as) {
// let's make it as simple as possible
JFrame jFrame = new JFrame("Hi!");
jFrame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码会生成一个Frame,但不是真的可用:

让它变大一点,只是为了揭示标题:
JFrame jFrame = new JFrame("Hi!");
jFrame.setSize(200, 50);
jFrame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
结果:

现在,让我们看看我们是否可以在框架中添加任何组件.让我们添加一个标签 - 在Swing中它是由类实现的JLabel:
JFrame jFrame = new JFrame("Hi!");
jFrame.setSize(200, 100);
JLabel label = new JLabel("Hello Swing!");
jFrame.add(label);
jFrame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

好的,我们做了什么?添加JLabel到了JFrame.如果您将查看Swing代码,则内部JFrame.add()方法会将该组件添加到ContentPane中.所以上面的代码相当于:
JFrame jFrame = new JFrame("Hi!");
jFrame.setSize(200, 100);
JLabel label = new JLabel("Hello Swing!");
jFrame.getContentPane().add(label); // <----
jFrame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
您可以自己检查ContentPane是否由JPanel内部实现.它在Swing代码中:
// this invocation...
JFrame jFrame = new JFrame("Hi!");
// effectively invokes following methods:
public JFrame(String title) throws HeadlessException {
// ...
frameInit();
}
protected void frameInit() {
// ...
setRootPane(createRootPane());
// ...
}
protected JRootPane createRootPane() {
JRootPane rp = new JRootPane();
// ...
}
public JRootPane() {
setGlassPane(createGlassPane());
setLayeredPane(createLayeredPane());
setContentPane(createContentPane());
// ...
}
protected Container createContentPane() {
JComponent c = new JPanel(); // <----
// ...
return c;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2925 次 |
| 最近记录: |