【问题标题】:What's so special about CardLayout vs manual adding/removal of JPanels?CardLayout 与手动添加/删除 JPanel 有什么特别之处?
【发布时间】:2012-05-28 12:06:26
【问题描述】:

在 StackOverflow 上有很多次用户提出这样的问题...

我有一个主JPanel,其中包含一个子JPanel。当用户点击一个 按钮,孩子JPanel 应该更改为不同的JPanel。我怎样才能 实现这一目标。

通常情况下,用户实际上已尝试实现此问题,但无法使其正常工作。

每当我回答这个问题时,我都会告诉他们做这样的事情(简单地说)......

JPanel myFrame = new JPanel();
myFrame.remove(oldPanel);
myFrame.add(newPanel);

我认为这是一个相当合理的答案,而且我个人在我自己的许多 Java 项目中都使用过它,没有任何问题。但是,我的回答总是遭到反对,每个人都只是说“使用CardLayout”。

所以我的问题是,为什么每个人都对CardLayout 如此着迷,以至于我的回答值得一票否决?为什么我应该选择使用CardLayout 而不是使用上面的代码添加/删除面板?

作为另一个问题,您是否仍然建议 CardLayout 用于具有动态 JPanel 的接口。例如,我的大多数程序都实现了一个自定义插件框架,其中可能有数百个JPanels,但我只加载和显示实际需要的面板。对于程序的正常使用,大多数面板实际上永远不会被加载或需要。对于这种情况,我的编码方法是否是最佳解决方案,因为我知道CardLayout 将要求我实际创建所有JPanels,即使大多数都不会使用?

【问题讨论】:

  • 我认为您在以建设性的方式表达您的问题方面做得很好。我希望它不会被关闭。
  • 谢谢你 - 我特意试着把它变成一个建设性的问题,很高兴得到一些好的反馈。
  • “但我只加载和显示实际需要的面板。” 延迟实例化也可以与CardLayout 一起使用,它支持数千个面板。
  • 谢谢@AndrewThompson,我不确定CardLayout 是否支持它,所以有点想把它扔进去以验证它是否支持/不支持这样的活动。
  • @WATTOStudios 请不要批准suggested edits like this。如果需要,请参阅此meta post 了解详细信息。

标签: java swing jpanel layout-manager cardlayout


【解决方案1】:
  • 使用 CardLayout,松散耦合更容易(尽管自己滚动也不是不可能)
  • 使用 CardLayout,持卡人的首选尺寸是其持有的最大卡片的尺寸。
  • CardLayout 更难实现,并且允许几乎微不足道的连续组件交换其 next()prev() 方法。
  • 您可以轻松地将所需的组件与一个常量相关联——无需为此创建Map<String, Component>,因为它已经为您准备好了。我经常为此使用枚举。
  • 更换组件时无需记住调用repaint()revalidate()
  • 它专为组件的重复使用而设计。

不过,我无法解释拒绝投票的原因,除非他们不高兴,否则您没有提到在交换组件时需要记住致电 repaint()revalidate()。您必须询问投反对票的人是否有足够的勇气做出回应。

【讨论】:

  • 感谢您的大力响应,我对其中的一些观点有一种直觉,它提供了许多使用CardLayout 的好案例。
  • 可以在herehere找到相关示例。
【解决方案2】:

CardLayout 已经过全面测试并证明可以正常工作。它正确获取component-tree lock 并执行组件validation 以确保不会出错。您的解决方案虽然在大多数情况下可能有效,但在某些情况下会失败。

这一切都归结为重新发明轮子:当这样一个久经考验的课程已经可用时,您为什么还要这样做?

【讨论】:

  • 这也提出了一些好处,感谢您的反馈。我当然可以理解,这将有助于为失败提供一些保证。关于重新发明轮子,我想我从来没有想过CardLayout 会适合我的目的,而且我在 Java 的低级进行了大量的修补,所以这对我来说并不是一个很大的飞跃使用较低级别的add()/remove() 选项。谢谢你的好点!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2017-02-19
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
相关资源
最近更新 更多