【问题标题】:Java - calling a method of an object not in scope (parent's children)Java - 调用不在范围内的对象的方法(父母的孩子)
【发布时间】:2011-04-22 07:25:40
【问题描述】:

这可能以前被问过很多次,或者我不知道要搜索什么才能得到答案。我得到的是一个加载在几个 JPanel 中的 JFrame。我遇到的困难是从另一个 JPanel 更新一个 JPanel 的内容。所以说我有以下内容:

JFrame1.JPanel1.JButtonA
JFrame1.JPanel2.JButtonB

按下 JButtonA 时,我希望 JButtonB 更改其文本。当然,这不是我想要做的,而是我想要实现的一个简单示例。我哪里错了?如何在不将所有内容都设为单例的情况下获取对对象的引用?

【问题讨论】:

  • 你能提供一个SSCCE吗?根据您的代码讨论它总是比任何抽象答案更好。

标签: java swing scope


【解决方案1】:

最简单的方法当然是在构造JPanel1时记住对JFrame1的引用:

JPanel1 p1 = new JPanel1(this);

记住并在 JPanel1 中使用它:

public JPanel1(JFrame1 f1) {
    this.f1 = f1;
}
...
public void actionPerformend(...) {
    f1.getPanel2().getButtonB().setText("A is pressed");
}

但是那很糟糕

相反,想想点击 A 的真正含义(例如 pauze 游戏)。然后创建一个PauzeGameEventListener 接口,由JPanel2(例如棋盘)实现并让JPanel1(例如游戏控制面板)向所有听众触发PauzeGameEvent .这样,当您的 JPanel3(例如 score panel)或非 GUI 的东西(例如 AI 播放器)也需要意识到这一点时,您不需要乱扔 JPanel1 代码。

【讨论】:

  • +1 很好的解释。虽然你必须读两遍才能得到它:)
  • @Boro:+1 同意。方便的是,所有JComponents 都有一个EventListenerList,API 显示了如何实现对这种自定义侦听器的支持。
  • 我忘了说它是 GoF 设计模式 Observer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 2017-06-05
相关资源
最近更新 更多