为什么不能共享BoxLayout而FlowLayout可以共享?

Mar*_*tin 6 java swing exception flowlayout boxlayout

我对此感到困惑.

案例A.

  1. 将JFrame的布局管理器设置为BoxLayout.
  2. 将JButton添加到JFrame容器中.
  3. 编译.
  4. 跑.
  5. 抛出异常:"线程中的异常"AWT-EventQueue-0"java.awt.AWTError:BoxLayout无法共享"

案例B

  1. 将JFrame的布局管理器设置为FlowLayout.
  2. 将JButton添加到JFrame容器中.
  3. 没有异常抛出.

为什么案例A抛出异常而案例B没有抛出异常?为什么FlowLayout和BoxLayout在这方面表现不同?在案例A中,"BoxLayout无法共享"是什么意思?

我在这个网站上读过一些关于这个异常消息的类似线程,但我仍然对与FlowLayout的比较以及异常消息的确切含义感到困惑.

Yas*_*jaj 5

简单回答

基本上,"BoxLayout can't be shared"在这种情况下意味着你​​正试图让你JFrame和它contentPane()共享同一个BoxLayout对象.


高级解释

设置Layouta时JFrame,它会隐含地调用,getContentPane().setLayout(manager)因此您实际上是在设置contentPane()的布局而不是框架本身.

这给我们带来了容器内如何检查BoxLayoutFlowLayout.


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()为a JPanel.

查看构造函数BoxLayout(container, int)并问自己:

现在我知道布局是在JPanel(contentPane())而不是JFrame自身上设置的,我将给这个构造函数赋予哪个参数?

给它JFrame自己一个好主意吗?知道它不是布局中已设置的组件吗?

答案是:当然这不是一个好主意.

以下是实现此目的的正确方法:

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), ...);
Run Code Online (Sandbox Code Playgroud)

为什么?

因为我们现在知道容器是,contentPane()并且最终,例如,当添加组件时,将进行检查,并且构造函数中的参数必须与设置object的组件完全相同,而组件中的参数layout不会与FlowLayout例如.


来源

BoxLayout

FlowLayout