【问题标题】:Listen to tab switches on the panels of a JTabbedPane聆听 JTabbedPane 面板上的选项卡开关
【发布时间】:2013-06-27 14:34:17
【问题描述】:

我开发了一个简单的 Swing GUI 以允许用户编辑我的应用程序的数据。用户界面相当简单:

  • 包含 JTabbedPane 的 JFrame。
  • 每个选项卡都由 JPanel 的一个子类组成,该子类提供编辑数据方面的工具。
  • 数据本身包含在一个对象中,并且一个引用被传递给每个 JPanel。

但是有一个问题:我需要同步不同的 JPanel。

例如,数据对象存储人员列表和任务列表。

  • 一个 JPanel 允许用户编辑人员。他可以创建新的 Person 并删除现有的。

  • 第二个 JPanel 允许用户将人员分配给任务。

两个 JPanel 在首次打开时都会被初始化。创建组件并设置布局。现在用户可以开始使用 UI。

  1. 他打开 JTabbedPane 的第一个选项卡并创建了第一个 Person。
  2. 他打开了第二个标签。第二个选项卡的组件被初始化并列出可用的一个人。他分配了一项任务。
  3. 他返回到第一个选项卡并创建了第二个人。
  4. 他切换回第二个选项卡来处理新人。

但是第二个选项卡和它包含的 JPanel 已经被初始化了。除非更新 JPanel,否则用户将看不到第二个人。我已经在我的 JPanel 子类上为选项卡 2 实现了一个自定义更新方法。但是我该如何调用它呢?

我需要重绘组件时触发的 Swing 事件。

【问题讨论】:

  • 您应该有一个 GUI 数据模型,其中包含所有人员和任务信息。每个 JPanel 都会更新,并通过控制器操作由数据模型的内容更新。这是构建 GUI 应用程序的模型/视图/控制器架构。
  • 我知道 MVC 模式。 Swing 几乎迫使你使用它。我要实现的是控制器。我只需要找到一种方法让控制器知道数据何时更新。 Victor Seifert 给出了完美的答案

标签: java swing user-interface awt


【解决方案1】:

实际上,当第一个面板被重绘时更新第二个面板是个坏主意,即使您设法找到被触发的事件。这将导致第二个面板在第一个面板的每次重绘时更新,无论重绘是否意味着基础数据已更改(考虑未保存的数据)。

您应该将数据设置为您的标签处理Observable(或Subject 来自Observer Pattern)。然后每个选项卡都可以对数据中的更改而不是其他选项卡中的更改做出反应。这会将更新时间减少到仅在真正需要时才更新,并且还可以将选项卡彼此分离。

数据可能会通过触发PropertyChangeEvent's 来表示更改。这些反过来应该触发 Gilber Le Blanc 在 cmets 中建议的控制器操作。

【讨论】:

  • 太棒了,正是我想要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多