这与this Java question有关。
这就是我的问题。我已经写了一个应用程序,它允许人们进行大量的数据输入,在许多单独的字段中键入。要确认每个字段中的更改,他们通常可以按Return (对于单行字段)或control-S (对于多行字段,其中Return将是有效的输入),但这很麻烦,所以我还允许字段在失去焦点时保存其内容。所以用户可以输入-制表符-类型,一切都很顺利。
除非他们更改了一个字段,然后单击应用程序窗口角落中的退出X。他们预计这将被算作失去焦点,并将保存最后的更改。但是丢失焦点事件不会发生,更改也会丢失。
我可以添加一个完成按钮,它的副作用是移动焦点并保存最后一个字段,然后退出。但我不应该这么做。在角落里有一个X,它应该做正确的事情。
我的第一个想法是
frame.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(.....因为我想从那里我可以发布()一些东西到我的SwingWorker来告诉它,在所有东西上调用loseFocus。没有这样的幸运;publish()是受保护的。
基本上,当单击X时,我需要在我的各种小部件上执行最后一个操作。我该怎么做?
编辑:我应该注意到,每个可编辑的小部件(dropdown、JTextPane等)都被扩展为保存实际的相关数据。小部件的所有数据都在这些扩展类实例中,例如用户输入的值是否有效,编辑之前的值是什么等等。没有其他地方保存值;这不是模型-视图-控制器。
这样做的原因是,小部件可以通过用户操作或网络消息进行更改;一条消息可能会完全丢弃现有的小部件,并用新的内容替换它。换句话说,doInBackground处于永久的读循环中,读取网络更新消息并发布()这些更新请求以处理()。在对process()的调用之间,用户操作照常发生。
底线是,没有全局数据结构可以在退出时获取值。它们都在几十到几百个数据结构中,由swing worker thread.The应用程序本身管理,在swing worker线程之外,甚至不知道存在什么样的值和小部件-所有小部件都是由来自服务器的网络消息创建、放置和销毁的。应用程序的其余部分(仅有的一点)无法安全地访问数据,除非我实现了大量的共享数据和锁定。
它都工作得无懈可击,我宁愿不会为了这个小小的关机案例而重新设计它。我从来没有想过我不能将额外的“关闭”消息从该线程外部发布到process()的工作队列中。(我的意思是线程安全队列的实现是微不足道的;为什么不实现呢?)
如果答案是“你不能在关机时和swing对话”,我会接受的。我确实有一个潜在的解决办法-我可以让x除了发送一条消息到服务器之外什么也不做,服务器可以写回一条“你应该关闭消息”来完成剩下的事情。但这似乎有些笨拙。
发布于 2020-02-12 10:41:18
简短的答案是,没有一个好的解决方案。我尝试安装一个关闭钩子并向swing线程发布一条消息,告诉它完成操作,然后给关闭线程一个500ms的休眠时间,让process()有时间发生。未调用process()。一旦关机开始,单独的publish()显然是不够的。
最重要的是,不要将需要获取的数据放在swing线程中。全局数据和同步函数是唯一可行的方法。
https://stackoverflow.com/questions/60118096
复制相似问题