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

2022-09-03 13:25:14

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

我有一个包含孩子的主菜。当用户单击按钮时,孩子应更改为其他 。我怎样才能做到这一点。JPanelJPanelJPanelJPanel

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

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

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

我认为这是一个非常合理的答案,我个人在我自己的许多Java项目中都毫无问题地使用它。但是,我总是为我的答案投反对票,每个人都只是说“使用一个”。CardLayout

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

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


答案 1
  • 使用CardLayout,可以更轻松地进行松散耦合(尽管使用自己的滚动并非不可能)
  • 使用CardLayout,持卡人的首选大小是它持有的最大卡的大小。
  • CardLayout更难上去,并且允许几乎微不足道的连续组件交换其和方法。next()prev()
  • 您可以轻松地将所需的组件与常量相关联 - 无需为此目的创建一个,因为它已经存在于您手中。我并不经常使用枚举。Map<String, Component>
  • 无需记住在交换组件时调用和调用。repaint()revalidate()
  • 它是为组件而构建的,并允许轻松重用组件。

我无法解释投票的原因,除非他们感到不安,你没有提到需要记住调用和交换组件。你必须问问下选民,他们是否有足够的勇气做出回应。repaint()revalidate()


答案 2

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

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


推荐