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



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

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

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

我认为这是一个很合理的答案,而且我个人在我自己的许多Java项目中都使用了它,没有问题。但是,我总是不满意我的回答,每个人都说“使用CardLayout”。

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

进一步的问题是,您是否仍建议为具有动态JPanels的接口(interface)使用CardLayout。例如,我的大多数程序都实现了一个自定义插件框架,其中可能有数百个JPanels,但是我仅按实际需要加载和显示面板。对于程序的正常使用,绝不会实际加载或要求使用大多数面板。对于这种情况,我的编码方法是否是最好的解决方案,因为我知道CardLayout将要求我实际创建所有JPanels,即使绝不会使用大多数ojit_code?

最佳答案

  • 使用CardLayout,松散耦合会更容易(尽管使用自己的滚屏并非不可能)
  • 使用CardLayout时,持卡人的preferredSize是它持有的最大卡的大小。
  • CardLayout较难理解,并允许几乎琐碎的连续组件交换其next()prev()方法。
  • 您可以轻松地将所需的组件与常量关联-无需为此目的创建Map<String, Component>,因为它已经为您服务。我没有经常使用枚举。
  • 交换组件时无需记住要调用repaint()revalidate()
  • 它是为允许轻松重用组件而构建的。

  • 不过,我无法解释投票否决的原因,除非他们不高兴,否则您没有提到交换组件时需要记住调用repaint()revalidate()的需要。您将不得不询问投票否决者是否足够勇敢做出回应。

    10-08 17:07