什么是JPanel,JFrame,JLayeredPane和JRootpane

abh*_*eet 4 java swing

我是java新手,在阅读时我遇到了各种框架和面板,JFrame,JLayeredPane,JRootPane和JPannel之间的混淆是什么,它们之间的差异是可以在单个类中同时使用JFrame和JPanel.

Rek*_*kin 9

看看这里的图片

框架结构图来自德语Java Tutorial页面.

一些细节

  • JFrame的是窗口,其显示为您的操作系统的顶层窗口.
  • JFrame由多个功能元素组成.例如,其中一个可以减轻正确实施工具提示的负担:LayeredPane.除此之外,工具提示始终位于其他所有内容之上.
  • contentPane的是把主要内容是最明智的地方.
  • 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,但不是真的可用:

第1步.可见框架

让它变大一点,只是为了揭示标题:

    JFrame jFrame = new JFrame("Hi!");
    jFrame.setSize(200, 50);
    jFrame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

结果:

步骤2.设置帧大小

现在,让我们看看我们是否可以在框架中添加任何组件.让我们添加一个标签 - 在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)

第3步.基本标签

好的,我们做了什么?添加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)