Java 什么';CardLayout与手动添加/删除JPanel相比有什么特别之处?

Java 什么';CardLayout与手动添加/删除JPanel相比有什么特别之处?,java,swing,jpanel,layout-manager,cardlayout,Java,Swing,Jpanel,Layout Manager,Cardlayout,在StackOverflow上有很多次用户问这样的问题 我有一个主JPanel,其中包含一个子JPanel。当用户单击 按钮,子JPanel应更改为不同的JPanel。我怎么能 实现这一目标 通常情况下,用户实际上已经尝试实现此问题,但无法使其正常工作 每当我回答这个问题时,我都会告诉他们这样做(简单地说) 我认为这是一个非常合理的答案,我个人在我自己的许多Java项目中都使用过它,没有任何问题。然而,我的答案总是被否决,每个人都说“使用CardLayout” 所以我的问题是,为什么每个人都对卡

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

我有一个主
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);