【问题标题】:How can I still use Borderlayout constant with a panel that is not a different Layout manager?我怎样才能在不是不同布局管理器的面板上使用 Borderlayout 常量?
【发布时间】:2014-10-08 08:39:39
【问题描述】:

对于这种特殊情况,我如何在面板上使用Borderlayout.EAST,面板具有不同的布局,即BoxLayout 布局管理器?难道面板本身必须要有BorderLayout 管理员才能使用BorderLayout.CONSTANT

 JPanel jp1 = new JPanel();
 jp1.setLayout(new BoxLayout(jp1, BoxLayout.X_AXIS));
 JPanel jp2 = new JPanel(new GridLayout());
 jp1.add(jp2, BorderLayout.EAST); //This worked even though jp1 is a BoxLayout, how did it use BorderLayout?

【问题讨论】:

  • BorderLayout.EAST 只是一个常量,由 Component.add 方法支持
  • 是什么让您认为它“有效”?你的意思是为什么它编译?请定义“工作”
  • @peeskillet 是的,它是如何编译的?
  • 它将编译,因为Container.add 允许(组件,对象)。这是否意味着在这种情况下将使用约束?不,这就是为什么我问你为什么认为它“有效”。它将编译,但您不会看到 BorderLayout.EAST 效果,就像布局设置为 BorderLayout 时一样。 tashgods 的回答解释了更多。
  • GridBagLayout 也是如此。使用此布局时,您指定 GridBagConstraints 作为第二个 Object 参数。对于 same add 方法,每个 Container 都有。但它只有在布局管理器设置为GridBagLayout 时才有效。您可以添加(并编译)您的示例,将 GridBagConstraints 作为第二个参数传递,但这并不意味着约束将生效

标签: java swing user-interface layout-manager border-layout


【解决方案1】:

这可能有点令人费解。当您将add()Component 转换为Container 时,addImpl() 会处理请求。像BorderLayout 这样的原始LayoutManager 可以理解像BorderLayout.EAST 这样的常量,它具有String"East"。像BoxLayout 这样的较新的LayoutManager2 永远不会看到未使用的约束。特别是,

如果当前布局管理器实现LayoutManager2,则在其上调用LayoutManager2.addLayoutComponent(Component,Object)。如果当前布局管理器没有实现LayoutManager2,而constraintsString,则在其上调用LayoutManager.addLayoutComponent(String,Component)

附录:BoxLayout 实现了LayoutManagerLayoutManager2。尽管BoxLayout 必须提供addLayoutComponent() 的两种变体,但该方法是“此类未使用”。实际上,BorderLayout.EAST 约束被忽略了。

void    addLayoutComponent(Component comp, Object constraints)
        Not used by this class.
void    addLayoutComponent(String name, Component comp)
        Not used by this class.

【讨论】:

  • 还是一头雾水……你能解释得更清楚些吗?
  • @MadProgrammer 你能帮帮我吗?
  • @OM 在这种 SO 格式中尝试和 "summon" 不属于原始讨论的人是不合适的。
  • @OM:我不确定你在哪里遇到了麻烦,但我已经在上面详细说明了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多