15

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

我有一个JPanel包含 child的 main JPanel。当用户单击一个按钮时,孩子JPanel应该更改为不同的JPanel. 我怎样才能做到这一点。

很多时候,用户实际上已经尝试过实现这个问题,但不能让它工作。

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

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

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

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

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

4

2 回答 2

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

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

于 2012-05-22T01:16:28.793 回答
8

CardLayout已经过彻底测试并证明有效。它正确获取组件树锁并执行组件验证,以确保不会出错。您的解决方案虽然在大多数情况下可能有效,但在某些情况下会失败。

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

于 2012-05-22T01:18:33.877 回答