JAVA中jframe的add方法,Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?...

本文详细解释了在JAVA中,JFrame的add方法的不同使用方式,即JFrame.getContentPane().add()与JFrame.add()的区别。主要内容包括JFrame构造时的默认rootPane,背景颜色设置的影响,以及在不同J2SE版本中add方法的行为变化。通过示例代码展示这两种方法在添加组件和设置布局时的效果差异。

区别如下:

当你创建一个JFrame的时候JFrame jf = new JFrame();

在构造方法JFrame()内部会给jf默认添加一个rootPane所以执行完JFrame jf = new JFrame();

这句话之后jf上面已经添加了一个默认的rootpanel了然后你再调用jf.add(panel)

这个时候,panel和rootPane是平级的

理由:1,你可以读源代码 ,查看构造方法怎么写的

2,或者你可以测试一下,分别执行 jf.setBackground(Color.blue);jf.getContentPane().setBackground(Color.black);

这两句代码,看看效果(实际上上面一句并不能改变界面的背景色,下面一句才可以,因为rootPane把jf给挡住了,上面一句是改变了jf的背景色,但是你眼睛看到的并不是jf,其实是rootPane.)

另外 jf.getContentPane()==jf.getRootPane().getContentPane() 上面的比较返回的true 所以你调用jf.getContentPane().add(panel) 其实是把panel添加到rootPane上面了,这个时候panel和rootPane就不是平级的了protected JRootPane createRootPane() {JRootPane rp = new JRootPane();// NOTE: this uses setOpaque vs LookAndFeel.installProperty as there// is NO reason for theRootPane not to be opaque. For painting to// work the contentPane must be opaque, therefor the RootPane can// also be opaque.rp.setOpaque(true);return rp;}

以上黄色部分是JFrame类的源代码片段!

示例:

在过去的J2SE版本中,部件(components)不能直接添加到最高级(top

level)的Swing容器,这些容器包括:JFrame, JDialog, JWindow,

JApplet和JInternalFrame.

例如现在有一个JFrame的instance命名为aFrame。我们要添加一个命名为aComponent的部件(比如一个JPanel)到JFrame里。以往我们需要调用JFrame的getContentPane()办法。如下:

aFrame.getContentPane().add(aComponent)

在J2SE5.0中,我们可以直接添加部件到最高级的Swing容器,也可以直接在容器内设置布局管理(Layout

Manager)和删除部件。这个变化允许我们可以省去调用getContentPane()而直接在容器内应用add(),setLayout()和remove()。然而,我们还是不能忽略了ContentPane,即使我们可能将不会再使用ContentPane来添加部件到容器。先看一个我们以往在J2SE1.4及其以前的版本经常应用到的例子。我们要设置一个JFrame的布局管理而且添加一些部件到该JFrame。查看api关于JFrame的文件可以发现,

JFrame从java.awt.Container继承了add()办法. 该add()是用来添加一个部件到JFrame容器.

Container类里也包含setLayout()办法,

该setLayout()是用来设置继承者(比如上面的JFrame容器)的布局管理。

下面是一个简单的例子:

import javax.swing.JFrame;

import javax.swing.JPanel;

import java.awt.GridLayout;

import java.awt.Color;

public class FrameTest extends JFrame {

//注意在1.4及其以前版本中可以编译,但是运行有问题

//5.0版本运行正常

FrameTest(){

super("Test");

setBackground(Color.BLACK);

setLayout(new GridLayout(6,6,2,2)); // 1.4中问题 1

for ( int i=0;i<36; i++){

JPanel jPanel = new JPanel();

jPanel.setBackground(new Color (

(int)(Math.random()*16777215)));

add(jPanel); // 1.4中问题 2

}

setSize(400,400);

setVisible(true);

}

public static void main(String[] args){

new FrameTest();

}

}

运行效果1如下:

a4c26d1e5885305701be709a3d33442f.png

这时我们注意到上面输出的JFrame的背景颜色并不是黑色而是白色,也就是说上面的setBackground(Color.BLACK)编译后该JFrame的背景颜色并没有被显示,如果要让JFrame背景颜色为黑色--grid之间颜色为黑色还需要调用getContentPane(),

getContentPane().setBackground(Color.BLACK);

运行效果2如下:

a4c26d1e5885305701be709a3d33442f.png

<think>我们正在讨论JavaSwing中将按钮添加到框架的内容面板。根据用户问题,重点在于使用getContentPane()方法。在Swing中,JFrame的内容面板是放置组件的容器。通常,我们使用getContentPane()获取内容面板,然后向其添加组件。同时,根据引用[2]提到的容器类,JFrame属于容器类,而内容面板实际上是JFrame内部的一个容器(通常是JPanel)。另外,引用[1]中展示了一个使用JOptionPane的简单例子,但用户的问题是关于添加按钮的。因此,我们将提供一个示例代码,展示如使用getContentPane()方法将按钮添加到JFrame的内容面板上。注意:在较新的Java版本中,可以直接调用JFrameadd方法,因为add方法已经被重写为自动将组件添加到内容面板。但为了明确展示getContentPane()的使用,我们将使用它。步骤:1.创建一个JFrame对象。2.使用getContentPane()方法获取内容面板(返回一个Container对象,通常我们可以将其转换为JPanel,但通常直接使用add方法即可)。3.创建一个按钮(JButton)。4.将按钮添加到内容面板上。5.设置框架的大小、关闭操作和可见性。示例代码:</think>在 Java Swing 中将按钮添加到框架内容面板的正确步骤如下(使用 `getContentPane()` 方法): ### 添加按钮到内容面板的步骤 1. **创建框架** 实例化 `JFrame` 作为主窗口容器: ```java JFrame frame = new JFrame("按钮示例"); ``` 2. **获取内容面板** 通过 `getContentPane()` 获取框架的默认内容面板: ```java Container contentPane = frame.getContentPane(); ``` 3. **创建按钮组件** 实例化 `JButton` 对象: ```java JButton button = new JButton("点击我"); ``` 4. **添加按钮到内容面板** 使用内容面板的 `add()` 方法: ```java contentPane.add(button); ``` 5. **配置框架属性** 设置窗口大小、关闭操作和可见性: ```java frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); ``` ### 完整代码示例 ```java import javax.swing.*; import java.awt.*; public class ButtonExample { public static void main(String[] args) { // 创建框架 JFrame frame = new JFrame("按钮示例"); // 获取内容面板 Container contentPane = frame.getContentPane(); // 创建按钮并添加到内容面板 JButton button = new JButton("点击我"); contentPane.add(button); // 默认使用BorderLayout.CENTER // 设置框架属性 frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } ``` ### 关键说明 1. **内容面板本质** 内容面板是 `JFrame` 内部管理的容器(通常为 `JPanel`),所有可见组件必须添加至此。Swing 组件层级关系为: $$ \text{JFrame} \rightarrow \text{Content Pane} \rightarrow \text{Components} $$ [^1] 2. **布局管理器** 默认使用 `BorderLayout`,可通过 `contentPane.setLayout(new FlowLayout())` 更改。例如网格布局: ```java contentPane.setLayout(new GridLayout(2, 2)); // 2行2列 contentPane.add(new JButton("按钮1")); contentPane.add(new JButton("按钮2")); ``` 3. **现代简化写法** JDK 1.5+ 允许直接调用 `frame.add(button)`,编译器会自动转发到内容面板[^2]: ```java frame.add(button); // 等效于 frame.getContentPane().add(button) ``` ### 常见问题解决 - **按钮不显示?** 检查是否遗漏 `frame.setVisible(true)` 或错误覆盖了 `paint()` 方法。 - **布局异常?** 确认是否调用了 `contentPane.revalidate()` 和 `contentPane.repaint()` 动态更新组件。 - **内容面板自定义** 可替换默认内容面板(需保留层级结构): ```java JPanel customPane = new JPanel(); frame.setContentPane(customPane); // 设置自定义面板 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值