问题标签 [invokeandwait]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - InvokeAndWait 的返回值
我有一个 Java GUI 应用程序,其中视图应该提供一个功能,例如要求用户选择路径。在用户选择路径(或者如果用户取消)之前,该功能应该是阻塞的。
由于没有在 EDT 线程的上下文中调用该函数,因此我使用了 invokeAndWait。它看起来像这样,其中 path 是视图的私有成员:
我的问题是如何将在 EDT 上下文中选择的路径传递给最初调用的函数并将其返回到那里。以下行已经阻塞:
目前我用 private member 解决了它path
,但实际上我不喜欢这个解决方案,因为 path 更像是一个临时变量,实际上与类本身无关。在为此寻找另一种解决方案时,我遇到了,SwingWorker
但我不知道如何解决我的“问题”。
另一个想法可能是创建一个对象,该对象具有一个字符串作为成员,getter 和 setter 设置此字符串并传递此对象的引用,该对象可以在 EDT 中设置字符串成员并将其返回到getPath
函数中以返回它。
有没有人更流畅的解决方案?
java - invokeLater 奇怪的调用,其他方法之后
我正在开发一个图书馆程序,当我进行给定的连续操作时,我的书籍 JTable 中添加了一个意想不到的行。
动作是这样的:
- 启动程序
- 根据注释添加过滤器(我有很多过滤器,它们是从 RowFilter 继承的类,它们都与 JTable 的 RowSorter 相关联。程序的这一部分工作正常)。在初始状态下,JTable 中有 2 本书,分别是“le livre de la丛林”和“Eloge des mathématiques”。使用过滤器后,只剩下一个“Eloge des mathématiques”。另一个未显示,但仍在模型中。
- 在 JTable 中选择剩余的书(“le livre de la丛林”)。使用调试器,我看到在单击触发的操作期间,创建了一本标题和作者为空的书。它不可见,但如果我
- 停用所有过滤器,JTable 中现在有 3 本书。(2 前一个加上带有虚拟值的“幽灵”。)虚拟值来自保存当前字段的方法 saveChanges()。
这是程序的图片,带有功能区(北)、字段(中)和 JTable(下)。
你可以看到额外的行,出乎意料。
现在,让我们看一些代码:
当我点击 JTable 的行时,我触发了这个方法:
这从 UnboundState 类调用 selectBook。窗口有 2 种状态:BoundState 和 UnboundState。UnboundState 在字段为空时使用。当这些字段包含一本书的数据时(例如,在互联网上使用 ISBN 进行远程搜索之后),它会立即被保存并且状态变为绑定。
在我上面谈到的搜索之后,状态与最初的状态保持一致,我的意思是 UnboundState :搜索只更改 JTable,而不更改字段。
所以,UnboundState 的 selectBook 被触发:
setBound 方法的目的是改变状态:
这是 setBound 调用的构造函数:
重要的是不应该调用方法 saveChanges(),因为调用 invokeLater 时的当前状态是“UNBOUND”。
但是当我调试程序时,我得到这个:方法运行,按照我给你的odrer,除了调试器不进入invokeLater,它继续,方法完成,最后一个是JTable听众。但是我在 saveChanges() 方法中放置了一个断点,我看到 saveChanges() 方法是在 JTable 的侦听器结束后触发的。这是我认为的 invokeLater 的效果。但当时,状态变为“绑定”,saveChanges 方法认为字段中的实际书籍是新的并尝试保存它。
我怎样才能让它工作?我尝试调用 invokeAndWait 但它冻结了程序(它肯定会停止,即使在 1 分钟或更长时间之后)。
java - SwingUtilities.InvokeAndWait() 不执行可运行代码
我正在编写一个线程代码,它打开一个服务器套接字,当连接到达时要求用户选择一个目录。我已经尝试使用 InvokeLater() 并且它可以工作,但是我无法控制何时检索所选文件目录,因此 InvokeAndWait 看起来是正确的选择。除了它实际上没有做任何事情,我什至尝试给它一个 println 并且它似乎根本没有执行任何事情。我如何解决它?我的想法不多了。谢谢!
}
java - Java 发生之前的关系 invokeAndWait
我的问题与这个问题有关,它已经有了答案:
是的,在线程调用/的操作和由此提交的可运行的 EDT 上的操作之间存在发生之前的关系。
invokeLater
invokeAndWait
我的问题有点笼统:是否甚至可以实现一个方法,invokeAndWait
例如 ,使其正常工作,但不强加发生前的关系?通过正常工作的方法,我的意思是:
- 提交
Runnable
的保证只执行一次。 - 提交
Runnable
在特定线程上执行。 - 该方法一直等到提交的执行
Runnable
完成。 - 该方法保证在提交的执行
Runnable
完成后返回。
对我来说,如果不强加发生之前的关系,似乎没有办法实现这一点,还是我错了?如果是这样,请包含一个示例实现,以证明这一点。