Java Swing布局管理器循环引用被设置了两次



有人能解释为什么在下面的代码中设置了两次循环引用吗?

//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在场景后面自己进行设置,并使用BoxLayout中的setter来实现代码紧凑性?

例如:

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

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

相反的方法是:让BoxLayout构造函数在目标容器上调用setLayout(this)。但我不知道为什么它还没有完成。

为什么需要显式地将BoxLayout链接回JPanel容器,而不是JPanel.setLayout在场景后面自己进行设置,并使用BoxLayout中的setter来实现代码紧凑性?

您所称的JPanel.setLayout实际上是Container.setLayout:

public void setLayout(LayoutManager mgr)

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

BoxLayout构造函数有可能变魔术吗?也许不是,尽管BoxLayoutContainer绑定,但反过来不一定正确。考虑:

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似乎是最好的,当然这一切都有点主观。

顺便说一下,请考虑将cntnrPnl重命名为containerPanel。去掉元音并不能节省多少钱。

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

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

最新更新