有什么特别之处CardLayout VS手动添加/移除JPanels的?(What's so

2019-06-24 15:23发布

已经有很多次在计算器上其中一个用户问一个问题是这样的...

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

通常情况下,用户实际上已经尝试实现这个问题,但无法得到它的工作。

每当我回答这个问题,我告诉他们做这样的事情(简言之)...

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

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

所以我的问题是,为什么大家如此着迷于CardLayout ,到了那里我的回答值得一downvote点? 为什么要选择使用CardLayout ,而不是添加/删除使用上面我的代码板?

作为进一步的问题,你还会提示CardLayout为具有动态JPanels接口。 例如,我的大部分程序的实现自定义插件框架,其中可能有几百JPanels ,但我只加载和他们实际需要的显示面板。 对于正常使用的程序,大部分的面板将永远不会真正被加载或要求。 对于这种类型的情况下,将我的编码方法是最好的解决方案,因为据我所知, CardLayout需要我真正创建所有的JPanels尽管大多数永远不会被使用?

Answer 1:

  • 随着CardLayout,它更容易具有松散耦合(尽管不是不可能的滚你自己的)
  • 随着CardLayout,卡持有人的首选大小是最大牌的它持有。
  • CardLayout更难FARK镜头,并允许其几乎微不足道的连续分量交换next()prev()方法。
  • 您可以轻松地将所需组件一个常量关联-无需拥有创建Map<String, Component>为了这个目的,因为它已经存在于你。 我不经常使用的枚举这一点。
  • 无需记住调用repaint()revalidate()交换组件时。
  • 它的建成并可以很容易地重复使用的组件。

我无法解释了反对票的原因,虽然,除非他们不高兴,你没有提到需要记住调用repaint()revalidate()交换组件时。 你必须要问的向下选民,如果他们有足够的勇气做出回应。



Answer 2:

CardLayout已经经过全面测试和验证工作。 它正确地获取组件树锁和执行部件的验证 ,以确保没有任何可能出错。 您的解决方案,虽然它可能工作的大部分时间,会在某些情况下会失败。

这一切都归结到重新发明轮子:你为什么要当这种经过时间考验的类是已经上市?



文章来源: What's so special about CardLayout vs manual adding/removal of JPanels?