Java 什么';CardLayout与手动添加/删除JPanel相比有什么特别之处?
在StackOverflow上有很多次用户问这样的问题 我有一个主Java 什么';CardLayout与手动添加/删除JPanel相比有什么特别之处?,java,swing,jpanel,layout-manager,cardlayout,Java,Swing,Jpanel,Layout Manager,Cardlayout,在StackOverflow上有很多次用户问这样的问题 我有一个主JPanel,其中包含一个子JPanel。当用户单击 按钮,子JPanel应更改为不同的JPanel。我怎么能 实现这一目标 通常情况下,用户实际上已经尝试实现此问题,但无法使其正常工作 每当我回答这个问题时,我都会告诉他们这样做(简单地说) 我认为这是一个非常合理的答案,我个人在我自己的许多Java项目中都使用过它,没有任何问题。然而,我的答案总是被否决,每个人都说“使用CardLayout” 所以我的问题是,为什么每个人都对卡
JPanel
,其中包含一个子JPanel
。当用户单击
按钮,子JPanel
应更改为不同的JPanel
。我怎么能
实现这一目标
通常情况下,用户实际上已经尝试实现此问题,但无法使其正常工作
每当我回答这个问题时,我都会告诉他们这样做(简单地说)
我认为这是一个非常合理的答案,我个人在我自己的许多Java项目中都使用过它,没有任何问题。然而,我的答案总是被否决,每个人都说“使用CardLayout
”
所以我的问题是,为什么每个人都对卡片布局如此着迷,以至于我的答案应该被否决?为什么我应该选择使用卡片布局
而不是使用上面的代码添加/删除面板
作为进一步的问题,您是否仍然建议对具有动态JPanel的接口使用CardLayout
。例如,我的大多数程序都实现了一个自定义插件框架,其中可能有数百个jpanel
,但我只按照实际需要加载和显示面板。对于程序的正常使用,大多数面板永远不会实际加载或需要。对于这种类型的场景,我的编码方法是否是最好的解决方案,因为我知道CardLayout
需要我实际创建所有JPanel
,即使绝大多数都不会被使用?
- 有了CardLayout,松耦合就更容易了(尽管使用自己的roll并非不可能)
- 对于CardLayout,持卡人的首选尺寸是其持有的最大卡的尺寸
- CardLayout更难修改,它允许几乎微不足道的连续组件交换其
next()
和prev()
方法
- 您可以轻松地将所需的组件与常量关联起来——无需为此创建
映射,因为它已经在那里了。为此,我经常使用枚举
- 交换组件时,无需记住调用
repaint()
和revalidate()
- 它是为方便组件的重复使用而构建的
不过,我无法解释投反对票的原因,除非他们感到不安,否则你没有提到在交换组件时需要记住调用repaint()
和revalidate()
。你必须询问投票人是否有足够的勇气做出回应。CardLayout
已经过全面测试并证明有效。它正确地获取并执行组件,以确保不会出错。您的解决方案虽然在大多数情况下都有效,但在某些情况下会失败
这一切都归结于对轮子的改造:既然已经有了这样一门经过时间考验的课程,你为什么还要这样做呢?我认为你已经很好地用建设性的方式表达了你的问题。我希望它不会被关闭。为此,我特意尝试将其作为一个建设性的问题,并很高兴得到一些好的反馈。“但我只按实际需要加载和显示面板。”惰性实例化也可以用于CardLayout
,它支持1000个面板。谢谢@AndrewThompson,我不确定CardLayout
是否支持这种活动,所以我把它扔进去,以验证它是否支持这种活动。@WATTOStudios请不要批准。如果需要,请参阅此以了解详细信息。感谢您的大力响应,我对其中的一些要点有一种直觉,并且它提供了许多使用CardLayout
的好案例。可能会找到相关的示例,这也提出了一些好的观点,感谢您的反馈。我当然可以理解,这将有助于提供一些防止失败的保证。关于重新发明轮子,我想我从来没有想到,CardLayout
会适合我的目的,我在Java的底层做了大量的修补工作,因此使用较低级别的add()
/remove()
选项对我来说并不是一个很大的飞跃。谢谢你的好评!
JPanel myFrame = new JPanel();
myFrame.remove(oldPanel);
myFrame.add(newPanel);