销毁 Jframe 对象

Posted

技术标签:

【中文标题】销毁 Jframe 对象【英文标题】:destroy Jframe object 【发布时间】:2013-03-21 22:41:42 【问题描述】:

我如何(就像不应该留下任何引用一样),因为我正在为 iTunes 之类的应用程序实现多用户登录系统,以便用户可以添加歌曲删除歌曲。我有 3 帧 loginFrame、adminFrame、nonAdminFrame .. loginFrame = 登录,启动 nonAdminFrame,其中添加删除歌曲被处理 正在处理登录,因为我有数据文件夹,其中 .txt 文件用于编写具有歌曲信息类型链接列表的用户对象。 我登录的方式我查看了数据文件夹,看看是否有名为 user1.txt 文件的 .txt 文件,它会将所有数据加载到 nonadminFrame ... 问题是登录不能正常工作,因为它引用了旧的 nonAdminFrame,以前的用户数据仍然存在......

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

【问题讨论】:

也许是我,但我对你的问题感到非常困惑。如果您没有很快得到一个体面的答案,您能否详细说明您的问题,显示相关代码,尝试解释一下您的代码,并告诉我们更多关于您正在尝试做什么以及什么不起作用的细节? @HovercraftFullOfEels 是你吗?还是机器人一遍又一遍地发布相同的评论? :P 我会补充一些细节... @Eng.Fouad:这当然是一个固定的回复,但我认为这是一种要求更多信息而又不会过于敌对的体面方式(这是我经常遇到的问题!)。例如,这比说“WTF”要好得多? 听起来,不是每次要使用它时都重新创建框架,而是使用单个引用。除非您花时间“清除”其值框架上的所有字段,否则它们将始终与它们输入的最后一个值一起出现。你有2个选择。每次需要使用框架时重新创建框架,或为框架提供清除其字段的方法 【参考方案1】:

在您的 user1.txt 文件中是否有办法通知该用户是否是管理员? 你的问题不是很清楚,但你应该可以这样做:

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

编译器会直接处理掉这个帧并使用垃圾收集器自动清理。

【讨论】:

管理员的东西已经处理好了。我试过了,但它不起作用。旧数据还在.. 这没有意义,因为框架及其所有组件和数据在处置后都会被销毁。您是否将用户数据存储到另一个位置?您是否使用某种会话管理器? 我必须通过使用 ObjectInputStream 和 ObjectOutputStream 写入和读取用户数据来实现会话持久性 .. 问题不在于您的非管理员框架。处理完框架后,所有数据都将永远消失(理论上)。尝试这种方法,如果您登录,请处理登录框架并在您注销时重新创建它。我不确定你的代码是什么样的,所以我不妨猜测一下:) 数据真的没了吗? a) dispose 的文档说:“通过随后调用打包或显示来重建本机资源,可以使窗口及其子组件再次可显示。” b) 我有一个 JUnit 测试,它在测试方法开始之前创建一个 JFrame,并在测试方法结束后对其调用 dispose()。在运行 5 种测试方法后,我在 Frame 数组中得到了 5 个相同的 JFrame 副本(例如 Frame.getFrames())。【参考方案2】:

这也做同样的事情:

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

这也将释放框架使用的任何资源,根据以下文章:http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html

【讨论】:

这将释放框架使用的本机资源,而不是它包含的组件(或那里的值)【参考方案3】:

如here 所示,您无法完全回收已处理帧的内存。相反,创建一个具有单个面板的单个框架,该面板使用CardLayout 来显示登录、管理和用户面板。一个例子可以看here。

【讨论】:

【参考方案4】:

就像其他人说的那样应该可以工作

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

但是如果你使用单例模式并且你声明一个 jframe 作为一个类成员

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

你必须添加这个

myframe.dispose();
myframe = null;

【讨论】:

以上是关于销毁 Jframe 对象的主要内容,如果未能解决你的问题,请参考以下文章

JFrame对象是啥意思??怎么包含3个??

JFrame对象是啥意思??怎么包含3个??

将JFrame对象类作为值传递给java中的HashMap

使用 getGraphics() 绘制对象而不扩展 JFrame

如何在WindowClosing事件期间更新JFrame对象?

JFrame容器