2

这似乎是一个非常初学者的问题,但我不知道答案。

假设您在 Java 中创建了一个新的 JFrame。新框架带有默认内容窗格。如果我声明一个变量并将其初始化为该框架的内容窗格,那么我初始化的变量是对框架的内容窗格的引用还是它自己的东西?例子:

JFrame frame = new JFrame();
Container panel = frame.getContentPane();

例如,如果我想更改内容窗格的布局,调整panel会产生与更改相同的效果frame.getContentPane()吗?

为了准确显示我的意思:

frame.getContentPane().setLayout(new GridLayout());

这会产生与以下相同的结果:

panel.setLayout(new GridLayout());

然后我所做的任何事情都会在我最后不必说的情况下panel得到反映吗?frameframe.setContentPane(panel);

4

4 回答 4

1

是的。内存中的一个对象可以有多个引用,对其中任何一个的任何更改都会反映在所有引用上(因为它们都指向同一个对象)。有关更多详细信息,请参阅此示例

于 2012-07-17T21:19:18.637 回答
1

绝对地。它们指向内存中的同一个对象。

想象一下将两根绳子系在一个气球上。你拿着一个(我们叫你panel),你把另一个字符串给一个朋友(我们叫他frame.getContentPane())。

现在,如果您的朋友跟随他的绳子,找到气球,并在上面戴上帽子(即frame.getContentPane().setLayout(new GridLayout());),那么当您跟随绳子时,您会发现一个带帽子的气球!

于 2012-07-17T21:23:17.457 回答
0

是的,它们指的是同一个Container对象。

换句话说,getContentPane()返回对基础的引用Container。因此,每当您使用引用时,都会使用/影响底层对象。

于 2012-07-17T21:17:31.400 回答
0

你的代码

JFrame frame = new JFrame();
Container panel = frame.getContentPane();

确实让变量panel指向框架的内容窗格。所以打电话

panel.setLayout( new GridLayout() );

将影响内容窗格的布局,正如panel它所指的那样。

但是,一个常见的错误是假设如果您执行类似的操作

JFrame frame = new JFrame();
Container panel = frame.getContentPane();
//... some more code

JPanel someOtherFancyPanel = ...;
panel = someOtherFancyPanel;

的内容窗格JFrame将变为someOtherFancyPanel. 当然不是这样。最后一条语句只是让panel变量指向someOtherFancyPanel并且不再指向框架的内容窗格,并使内容窗格保持不变。

于 2012-07-18T06:05:22.657 回答