【问题标题】:Java Swing JPanel: How to forward all method calls to a child JPanel?Java Swing JPanel:如何将所有方法调用转发给子 JPanel?
【发布时间】:2018-03-09 22:34:18
【问题描述】:

我想创建一个 JPanel,它覆盖右上角的一个按钮,但在其他方面表现得与任何其他 JPanel 一样。我能想出的唯一解决方案是这样的:

public class MyJPanel extends JPanel {
    private final JPanel realPanel = new JPanel();
    private final Button button = new JButton();
    public MyJPanel() {
        super(new OverlayLayout());
        ...layout the realPanel and the button on top of it...
    }
    ... implement all public JPanel methods and delegate to "realPanel"...
}

但是要让它起作用,我必须重写一大堆方法并将它们委托给“realPanel”。有没有比让 MyJPanel 实现几十个方法更简单/更简单的方法,这些方法除了在子面板上调用相同的方法之外什么都不做?

【问题讨论】:

  • 哇——简化,简化。为什么不通过 M-V-C 从 GUI 中提取所有逻辑,让您的生活(和您的代码)更简单、更易于管理?
  • 请问这个的最终目标是什么? :) 如果您更喜欢改进按钮的外观(例如添加“徽章”覆盖),官方解决方案是实现自定义按钮 LAF。一个更简单的解决方案是重写按钮的paintComponent方法来绘制你想要的任何东西。
  • 抱歉没有具体说明。我的目标是在选项卡行空间的右上角(假设选项卡在顶部)创建一个带有内置“帮助”按钮的 JTabbedPane。理想情况下,它会扩展 JTabbedPane,但我不知道如何在不必手动绘制按钮并处理其点击事件的情况下做到这一点。所以我选择了一个“外部”JPanel 容器,里面有一个 JTabbedPane 和一个 JButton(通过 OverlayLayout 布局),并将所有布局/添加/删除操作转发到包含的 JTabbedPane。

标签: java swing methods jpanel delegation


【解决方案1】:

Swing 鼠标事件经过命中测试并转发到鼠标下方的组件。您需要:

  1. 实现那些监听器(哦,还要翻译相对于最顶部面板的鼠标事件坐标)

  2. 不使用面板,而是通过自定义按钮的绘画来装饰按钮(例如覆盖 paintComponent,或实现自定义 LAF)。这种情况下,自定义的还是同一个组件,所以按钮会接收到所有的鼠标事件。

PS:解释为什么你希望实现一个目标总是一个好主意,而不是仅仅推动实现某个解决方案。如果真正的问题被理解了,还有更多的解决方案。

【讨论】:

  • 一个不透明(透明)的组件将允许鼠标事件通过它传递到它下面的组件 - 我通过创建一个透明组件来测试它,并覆盖 paintComponent 以绘制各种级别的透明从完全透明到完全不透明的颜色没有问题 - 但是,我不知道 OP 在问什么或他们为什么要尝试实现
  • “解释_为什么_你希望实现一个目标总是一个好主意,而不是仅仅推动实现某个解决方案。”What is the XY problem?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多