CardLayout与手动添加/删除JPanels有什么特别之处?
在StackOverflow上有很多次用户问这样的问题……
我有一个主要的
JPanel
,包含一个孩子JPanel
。 当用户单击按钮时,子JPanel
应更改为其他JPanel
。 我怎样才能做到这一点。
通常,用户实际上已尝试实现此问题,但无法使其正常工作。
每当我回答这个问题时,我都会告诉他们做这样的事情(简单地说)……
JPanel myFrame = new JPanel(); myFrame.remove(oldPanel); myFrame.add(newPanel);
我认为这是一个非常合理的答案,我个人在我自己的许多Java项目中都没有使用过这个问题。 但是,我总是得到我的回答,每个人都只是说“使用CardLayout
”。
所以我的问题是,为什么每个人都对CardLayout
如此着迷,以至于我的答案值得投票? 我为什么要选择使用CardLayout
而不是使用上面的代码添加/删除面板?
作为进一步的问题,您是否仍然建议使用具有动态JPanel的接口的CardLayout
。 例如,我的大多数程序都实现了一个自定义插件框架,其中可能有数百个JPanels
,但我只是加载并显示实际需要的面板。 对于程序的正常使用,大多数面板实际上永远不会被加载或需要。 对于这种类型的场景,我的编码方法是否是最好的解决方案,因为据我所知, CardLayout
要求我实际创建所有的JPanels
即使大多数都不会被使用?
- 使用CardLayout,松散耦合更容易(尽管不是不可能使用自己的卷)
- 使用CardLayout,持卡人的首选尺寸是其持有的最大卡。
- CardLayout更难以实现,并允许几乎无关紧要的连续组件交换其
next()
和prev()
方法。 - 您可以轻松地将所需组件与常量相关联 – 无需为此目的创建
Map
,因为它已经存在。 我不经常使用枚举。 - 交换组件时无需记住调用
repaint()
和revalidate()
。 - 它专为组件而设计,可轻松重复使用。
我无法解释投票失败的原因,除非他们感到不安,否则你没有提到在交换组件时需要记住调用repaint()
和revalidate()
。 如果他们足够勇敢回应,你将不得不问下选民。
CardLayout
经过全面测试并certificate可行。 它正确获取组件树锁并执行组件validation ,以确保不会出现任何问题。 您的解决方案虽然可能在大多数情况下有效,但在某些情况下会失败。
这一切都归结为重新发明轮子:为什么你想要这样一个经过时间考验的课程?