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

wat*_*ios 14 java swing jpanel layout-manager cardlayout

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

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

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

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

JPanel myFrame = new JPanel();
myFrame.remove(oldPanel);
myFrame.add(newPanel);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Hov*_*els 14

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

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

  • 感谢您的好评,我对其中的一些观点有了直觉,并提供了一些使用"CardLayout"的好例子. (2认同)
  • 可以在[此处](http://stackoverflow.com/a/5655843/230513)和[此处](http://stackoverflow.com/a/6432291/230513)找到相关示例. (2认同)

Jef*_*rey 8

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

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