简单的回答
基本上,在这种情况下,"BoxLayout不能共享"
的意思是你试图让你的JFrame
和其contentPane()
共享同一个BoxLayout
对象。
高级解释
在为JFrame
设置Layout
时,它隐式地调用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)
,因此布局设置在默认情况下为JPanel
的contentPane()
上。
查看BoxLayout(container, int)
的构造函数并思考:
现在我知道布局设置在JPanel
(contentPane()
) 上而不是JFrame
本身上,我应该给这个构造函数哪个参数?
将JFrame
自身作为参数是否是一个好主意?知道它不是布局已设置的组件吗?
答案是:当然不是一个好主意。
以下是正确的实现方式:
JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), ...);
为什么?
因为我们现在知道容器是 contentPane()
,并且当添加组件时,将会进行检查,构造函数中的参数必须是设置了 layout
的组件上的相同 object
,而这不会发生在例如 FlowLayout
中。
来源
BoxLayout
FlowLayout