销毁JFrame对象

6
我如何销毁Jframe对象(即不应留下任何引用),因为我正在实现类似于iTunes的多用户登录系统,以便用户可以添加歌曲和删除歌曲。我有3个框架loginFrame、adminFrame、nonAdminFrame。 loginFrame = 登录,启动nonAdminFrame,在那里处理添加和删除歌曲 登录已经处理好了,因为我有一个数据文件夹,其中使用.txt文件编写用户对象,该对象具有歌曲信息类型的链接列表。 我登录的方式是查看数据文件夹,并查看是否存在名为user1.txt的文件,然后将所有数据加载到nonadminFrame中... 问题在于登录不正常工作,因为它与旧的nonAdminFrame相关,旧用户数据仍然存在...

我有3个类或3个JFrames。主类是loginFrame。我获取登录信息并查看用户是管理员还是非管理员,然后通过创建新的adminFrame()对象或nonAdminFrame()对象来显示管理员或非管理员框架,并设置loginFrame.setVisible(false)。 问题出在nonAdminFrame上,所有的iTunes库都在这里发生。我有一个JTree来显示该用户的所有歌曲,一旦点击注销,我使用frame.dispose()来处理nonAdmin框架,但如果我再次使用不同的登录信息登录并创建一个nonadminFrame()对象,我会在JTree中看到旧用户的数据,这就是问题所在...


1
也许是我自己的问题,但是我对你的问题感到非常困惑。如果你没有很快得到一个合适的答案,能否详细说明一下你的问题,展示相关代码,尽量解释一下你的代码,并告诉我们更多关于你正在尝试做什么以及出了什么问题的细节? - Hovercraft Full Of Eels
@HovercraftFullOfEels 是你吗?还是一个机器人一遍又一遍地发布相同的评论?:P - Eng.Fouad
2
@Eng.Fouad:当然,这是一个标准回复,但我认为这是一种不会过于对立的请求更多信息的体面方式(这通常是我的问题!)。例如,这比说“WTF”要好得多。 - Hovercraft Full Of Eels
1
听起来,你不是每次想要使用它时都重新创建帧,而是在使用单个引用。除非你花时间“清除”框架上所有字段的值,否则它们将始终显示其输入的最后一组值。你有两个选择。每次需要使用它们时重新创建框架或提供一种方法让框架清除其字段。 - MadProgrammer
当你需要时重新创建框架。不要只在一开始使用JFrame frame = new JFrame();,每次想显示框架时都需要这样做。至于清除字段,则取决于您如何实现它们。 - MadProgrammer
显示剩余4条评论
4个回答

15

在你的 user1.txt 文件中是否有一种方式可以知道该用户是否为管理员?

你的问题不是很清楚,但是你应该能够像这样做:

JFrame frame = new JFrame();
frame.dispose();

编译器会直接销毁这个框架并使用垃圾回收自动清理。


这是没有意义的,因为在 dispose 之后,框架及其所有组件和数据都被销毁了。您是否将用户数据存储到其他位置?您是否使用某种会话管理器? - DerpyNerd
我必须通过使用ObjectInputStream和ObjectOutputStream编写和读取用户数据来实现会话持久化。 - jrdnsingh89
问题不在于你的nonadminframe。在销毁该框架后,所有数据都将永远消失(理论上)。如果您登录,请尝试这种方法:在注销时处理登录框架并重新创建它。 我不确定您的代码是什么样子的,所以我只能猜测 :) - DerpyNerd
数据真的消失了吗?a) dispose 的文档说:“通过在随后调用 pack 或 show 来重新构建本机资源,可以使窗口及其子组件再次可显示。” b) 我有一个 JUnit 测试,在测试方法开始之前创建一个 JFrame,并在测试方法结束后调用 dispose()。运行 5 个测试方法后,我会在 Frame 数组中得到 5 个相同的 JFrame 副本(类似于 Frame.getFrames())。 - Jack Straub
@JackStraub 这不意味着垃圾收集器在您尝试查找组件之前没有处理掉组件吗?或者在您处置框架后执行的任何操作都具有与.pack()相同的效果吗?您应该在调用dispose后使用Thread.sleep(4000);进行测试,而不要销毁框架。看看垃圾收集器销毁了什么。 - DerpyNerd
显示剩余5条评论

3

像其他人说的那样,这应该有效。

JFrame frame = new JFrame();
frame.dispose();

但是,如果您使用单例模式并将JFrame声明为类成员

private static jFrame myframe = null ... singleton pattern...
...

你需要添加这个:

你必须添加这个


myframe.dispose();
myframe = null;

3

此处所示,您无法完全回收已处理的帧的内存。相反,创建一个单一的帧,其中包含一个使用CardLayout来显示登录、管理员和用户面板的单个面板。可以在此处看到一个示例。


3

1
这将释放框架使用的本地资源,而不是它所包含的组件(或其值)。 - MadProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接