【问题标题】:Java Swing : How to put a Component over 2 different panels?Java Swing:如何将组件放在 2 个不同的面板上?
【发布时间】:2017-01-30 09:06:35
【问题描述】:

出于某些设计目的,我需要有一个超过 2 个面板的 Java UI 组件。但是,似乎任何 JComponent 都必须有一个父级,而且只有一个。因此我的问题如下:你有什么技巧可以让一个组件同时通过 2 个面板吗?

我在这篇文章中附上了我想要的东西。

【问题讨论】:

  • “出于某些设计目的,我需要在 2 个面板上拥有一个 Java UI 组件。” 请具体说明具有这种不寻常要求的确切“设计目的”。以最小尺寸提供 GUI 的 预期完整 - 忽略所有容器但显示所有组件)布局的 ASCII 艺术或简单绘图,如果可调整大小,则提供更多宽度和高度。
  • How to put a component on top of others?建议的方法中选择一种方法

标签: java swing jpanel layout-manager


【解决方案1】:

正如您正确指出的那样,每个组件都必须有一个父组件。因此,您必须将 JPanel 1、JPanel 2 和 JComponent 添加到一个公共容器中。

我的建议是将 JPanel 1 和 JPanel 2 添加到另一个 JPanel,例如 BorderLayout 或 GridLayout,然后将该 JPanel 和覆盖的 JComponent 添加到另一个 JPanel 并使用自定义布局管理器。

查看接口LayoutManager - 它安排容器中组件的边界和位置。假设你知道你想要什么,它实际上并不难实现。在这种特殊情况下,JComponent 可以相对于两个 JPanel 组件进行布局,这两个 JPanel 组件可以显式传递给LayoutManager 实现。

这将是一个非常具体的解决方案,但您也可以通过使用LayoutManager2 而不是LayoutManager 来概括它。 LayoutManager2 允许对要布局的组件使用约束对象。每个约束都是一个描述组件布局的普通 Java 对象。它特定于所使用的 LayoutManager2 实现。

【讨论】:

    【解决方案2】:

    如果您覆盖面板的repaint 方法并且您不将组件添加到任何面板,则可以,但是这种解决方案过于复杂。

    一个组件只能属于一个面板。

    您可以使用包含所有三个元素的第三个面板以及以下两个布局选项:

    1.没有布局管理器
    https://docs.oracle.com/javase/tutorial/uiswing/layout/none.html

    2。 OverlayLayout 布局 https://docs.oracle.com/javase/8/docs/api/javax/swing/OverlayLayout.html

    【讨论】:

    • 我想到了这个解决方案。如果是这样:如何使元素之一(“JComponent”)位于其他元素之上?没有“Z 索引”或类似的东西......
    • 顺序(如您所说的z-index)由元素添加到容器中的顺序给出。
    • 没有布局管理器 NOOOOOOOOOO!!!!!!!!!!!!!请停止推荐使用null-layout。请参阅 null layout is evilthis question 中的答案,了解为什么这是一个不好的做法,所以,请停止推荐它
    猜你喜欢
    • 2013-05-21
    • 2010-10-25
    • 2017-08-15
    • 2013-03-21
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多