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

标签 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. 编译
  4. 运行
  5. 没有抛出异常。

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

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

最佳答案

简单回答

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


进阶说明

当为 JFrame 设置 Layout 时,它隐式调用 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 在默认情况下是 JPanelcontentPane() 上设置。

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

现在我知道 Layout 是在 JPanel (contentPane()) 上设置的,而不是 JFrame 本身,我将使用哪个参数给这个构造函数?

给它 JFrame 本身是个好主意吗?知道不是Layout上设置的Component?

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

这是实现此目的的正确方法:

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

为什么?

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


来源

BoxLayout

FlowLayout

关于java - 为什么不能共享 BoxLayout 而 FlowLayout 可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33842193/

相关文章:

Java GUI 菜单栏

c# - CA1004 和异常/错误处理协助

java - Spring - 在 Web 请求完成并触发 RequestMapping 之前执行

java - "URI is not registered"在 XHTML 页面中使用 http ://xmlns. jcp.org/jsf/html"

java - 在 Spring 中与 JBOSS 一起使用 native 库

Java:如何从 AbstractAction 对象引用 GUI 组件?

java - JTable 缺少列标题

java - 未报告的异常/this() 需要是第一个语句

java - 无法定义和实例化 HashMap?

java - 有人知道 JDeveloper/SQL Developer 使用什么加密技术来持久化凭据吗?