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

时间:2015-11-21 10:23:24

标签: java swing exception flowlayout boxlayout

我对以下内容感到困惑。

案例A

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

    1. 将JFrame的布局管理器设置为FlowLayout。
    2. 将JButton添加到JFrame容器中。
    3. 编译
    4. 运行
    5. 没有例外。
    6. 为什么案例A抛出异常而案例B没有抛出异常?为什么FlowLayout和BoxLayout在这方面表现不同?在案例A中," BoxLayout无法共享"是什么意思?

      我在本网站上已经阅读了一些关于此异常消息的类似线程,但我仍然对与FlowLayout的比较以及异常消息的确切含义感到困惑。

1 个答案:

答案 0 :(得分:5)

简单回答

基本上,"BoxLayout can't be shared"在这种情况下意味着您尝试让JFrame及其contentPane()共享相同的BoxLayout对象。

高级解释

Layout设置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() JPanel

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

现在我知道布局设置在JPanelcontentPane())而不是JFrame本身,我将为此构造函数提供哪个参数?

给它JFrame本身是个好主意吗?知道它不是布局中的组件吗?

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

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

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), ...);

<强>为什么吗

因为我们现在知道容器是 contentPane() ,并且最终在添加组件时会发生检查,构造函数中的参数必须是与设置object的组件完全相同layout,例如,FlowLayout不会发生这种情况。

来源

BoxLayout

FlowLayout