CardLayout与手动添加/删除JPanels有什么特别之处?

时间:2012-05-22 01:06:14

标签: java swing jpanel layout-manager cardlayout

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

  

我有一个包含孩子JPanel的主JPanel。当用户点击一个   按钮,子JPanel应更改为其他JPanel。我怎么能够   实现这一目标。

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

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

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

我认为这是一个非常合理的答案,我个人在我自己的许多Java项目中都没有使用过这个问题。但是,我总是得到我的回答,每个人只是说“使用CardLayout”。

所以我的问题是,为什么每个人都对CardLayout如此着迷,以至于我的答案值得推崇?我为什么要选择使用CardLayout而不是使用上面的代码添加/删除面板?

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

2 个答案:

答案 0 :(得分:14)

  • 使用CardLayout,松散耦合更容易(虽然不是不可能自己滚动)
  • 使用CardLayout,持卡人的首选尺码是它持有的最大牌。
  • CardLayout更难以实现,并允许几乎无关紧要的连续组件交换其next()prev()方法。
  • 您可以轻松地将所需组件与常量相关联 - 无需为此目的创建Map<String, Component>,因为它已经存在。我不经常使用枚举。
  • 交换组件时无需记得致电repaint()revalidate()
  • 它专为组件而设计,可以轻松重复使用。

我无法解释投票失败的原因,除非他们感到不安,否则你没有提到在交换组件时需要记住调用repaint()revalidate()。如果他们有足够的勇气回应,你将不得不问下选民。

答案 1 :(得分:8)

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

这一切都归结为重新发明轮子:为什么你想要这样一个经过时间考验的课程?