我正在创建一个迷你软件应用程序,如果你愿意,它会使用多个“菜单屏幕”。例如;主菜单屏幕,登录屏幕以及应用程序支持的所有不同功能的屏幕。我目前正在使用以下类处理此问题:
public class ScreenUpdater {
public static void updateScreen(JPanel screen, JFrame frame) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.remove(frame.getContentPane().getComponent(0));
frame.getContentPane().add(screen);
frame.invalidate();
frame.revalidate();
}
});
}
}
静态方法updateScreen()采用以下参数:
这对我来说效果很好,但是我注意到了一些我认为有问题的东西。例如,LoginScreen将在按下按钮时调出另一个屏幕,所有这些都将在按钮的被调用方法中发生,这使我相信即使没有显示LoginScreen,它仍然存在,并且对它有活动的引用。此外,在两次返回同一屏幕后,新实例将堆积起来,垃圾收集器无法处理先前的实例,因为它们在堆栈中较低。
为了解决这个问题,我相信Singleton设计模式可能会有用。
我对你们的问题都是(按重要性排序):
非常感谢大家!
澄清 - 这就是我在提到垃圾收集问题时的意思。假设我们有一个名为LoginScreen()的类,其方法名为login()。方法login()实例化MainMenu()类,以便现在可以在JFrame中显示。在原始login()方法完成之前,将调用从MainMenu()类调用的所有方法。这使我相信垃圾收集器不会收集原始的LoginScreen()。
答案 0 :(得分:2)
简短的回答是,不,这听起来不像是使用单身人士的理由。
你已经说过,你担心即使没有显示这些屏幕,你也会在这些屏幕上保留实例:是什么让你相信?如果您没有任何引用它们,那么它们将有资格进行垃圾收集。一旦方法退出,假设您没有对屏幕的任何其他引用,那么该对象将有资格进行垃圾收集。
然而,无论如何,所有这些听起来都像是CardLayout的工作。
如果您想了解更多信息,请发布MCVE。