0

谁能解释为什么在以下代码中设置了两次循环引用?

//declare panel
this.cntnrPnl = new JPanel();
//define layout manager for the panel - but why circ ref?
this.cntnrPnl.setLayout(new BoxLayout(this.cntnrPnl, BoxLayout.Y_AXIS));

为什么需要显式地将BoxLayout后端链接到JPanel容器,而不是 JPanel.setLayout在后台自行设置并使用 setter 来BoxLayout实现代码紧凑性?

例如:

this.cntnrPnl.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
//and then in JPanel.setLayout have something line
_layout.setContainer(this);
4

3 回答 3

2

因为 BoxLayout 是一种特殊的布局,需要引用它所布局的目标容器。并非所有布局管理器都是如此。在方法中为 BoxLayout 添加特定案例会很丑陋setLayout()。这也意味着 BoxLayout 在构建后将处于不稳定状态,因为它还没有强制目标容器。

setLayout(this)反之亦然:在目标容器上调用 BoxLayout 构造函数。但我不知道为什么它还没有完成。

于 2012-12-10T22:18:16.913 回答
1

为什么需要显式地将BoxLayout后端链接到JPanel容器,而不是JPanel.setLayout在后台自行设置并使用 setter 来BoxLayout实现代码紧凑性?

你所说JPanel.setLayout的实际上是Container.setLayout

public void setLayout(LayoutManager mgr)

您使用 a 调用该方法,BoxLayout因为它implements LayoutManager。但是LayoutManager没有setContainer方法,所以如果不添加该方法就无法工作。但似乎大多数布局管理器并不关心容器,因此该方法不属于那里。

构造函数有可能BoxLayout做到这一点吗?也许不是,尽管 aBoxLayout与 a 相关联Container,但反过来不一定正确。考虑:

this.cntnrPnl = new JPanel();
BoxLayout bY = new BoxLayout(this.cntnrPnl, BoxLayout.Y_AXIS);
BoxLayout bX = new BoxLayout(this.cntnrPnl, BoxLayout.X_AXIS);

现在您可以在不同时间调用this.cntnrPnl.setLayout(bX)this.cntnrPnl.setLayout(bY)

因此,从所有选项来看,当前的 API 似乎是最好的,当然这一切都有些主观。

顺便说一下,请考虑重命名cntnrPnlcontainerPanel. 去掉元音并没有真正节省多少。

于 2012-12-10T22:53:31.217 回答
0

因为 JPanel 不是 Swing 中唯一可用的容器。特别是,您可能会创建自己的容器类,但不知道 BoxLayout 的那些特殊要求。因此,布局管理器不适用于您的实现。

现在有人可能会问为什么 BoxLayout 一开始就需要对 JPanel 的引用,但这是另一回事。

于 2012-12-10T22:08:17.540 回答