我对以下内容感到困惑。
案例A
案例B
为什么案例A抛出异常而案例B没有抛出异常?为什么FlowLayout和BoxLayout在这方面表现不同?在案例A中," BoxLayout无法共享"是什么意思?
我在本网站上已经阅读了一些关于此异常消息的类似线程,但我仍然对与FlowLayout的比较以及异常消息的确切含义感到困惑。
答案 0 :(得分:5)
基本上,"BoxLayout can't be shared"
在这种情况下意味着您尝试让JFrame
及其contentPane()
共享相同的BoxLayout
对象。
为Layout
设置JFrame
时,会隐含地调用getContentPane().setLayout(manager)
,因此您实际上是在设置contentPane()的布局而不是框架本身。
这会让我们了解如何在BoxLayout
和FlowLayout
内检查容器。
<强> FlowLayout
强>
此布局没有将容器作为参数的构造函数,因此在构造对象时不会考虑容器。这个类都没有container
实例变量。
<强> BoxLayout
强>
BoxLayout
有一个构造函数,它将容器作为参数并将其存储在实例变量target
中。这样做是为了稍后在layoutContainer(container)
方法中进行检查。它有一个checkContainer(container)
方法,用于验证实例变量是否等于参数中给出的容器。如果不是这样,它会抛出throw new AWTError("BoxLayout can't be shared");
。
这是对以下解释的介绍。
如第一段所述,JFrame.setLayout(LayoutManager)
会调用JFrame.getContentPane().setLayout(LayoutManager)
,因此Layout
默认设置为contentPane()
JPanel
。
查看BoxLayout(container, int)
的构造函数并问自己:
现在我知道布局设置在JPanel
(contentPane()
)而不是JFrame
本身,我将为此构造函数提供哪个参数?
给它JFrame
本身是个好主意吗?知道它不是布局中的组件吗?
答案是:当然不是一个好主意。
以下是实现此目的的正确方法:
JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), ...);
<强>为什么吗
因为我们现在知道容器是 contentPane()
,并且最终在添加组件时会发生检查,构造函数中的参数必须是与设置object
的组件完全相同layout
,例如,FlowLayout
不会发生这种情况。