问题标签 [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.

0 投票
1 回答
540 浏览

java - InvokeAndWait 的返回值

我有一个 Java GUI 应用程序,其中视图应该提供一个功能,例如要求用户选择路径。在用户选择路径(或者如果用户取消)之前,该功能应该是阻塞的。

由于没有在 EDT 线程的上下文中调用该函数,因此我使用了 invokeAndWait。它看起来像这样,其中 path 是视图的私有成员:

我的问题是如何将在 EDT 上下文中选择的路径传递给最初调用的函数并将其返回到那里。以下行已经阻塞:

目前我用 private member 解决了它path,但实际上我不喜欢这个解决方案,因为 path 更像是一个临时变量,实际上与类本身无关。在为此寻找另一种解决方案时,我遇到了,SwingWorker但我不知道如何解决我的“问题”。

另一个想法可能是创建一个对象,该对象具有一个字符串作为成员,getter 和 setter 设置此字符串并传递此对象的引用,该对象可以在 EDT 中设置字符串成员并将其返回到getPath函数中以返回它。

有没有人更流畅的解决方案?

0 投票
0 回答
43 浏览

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 分钟或更长时间之后)。

0 投票
1 回答
398 浏览

java - SwingUtilities.InvokeAndWait() 不执行可运行代码

我正在编写一个线程代码,它打开一个服务器套接字,当连接到达时要求用户选择一个目录。我已经尝试使用 InvokeLater() 并且它可以工作,但是我无法控制何时检索所选文件目录,因此 InvokeAndWait 看起来是正确的选择。除了它实际上没有做任何事情,我什至尝试给它一个 println 并且它似乎根本没有执行任何事情。我如何解决它?我的想法不多了。谢谢!

}

0 投票
1 回答
123 浏览

java - Java 发生之前的关系 invokeAndWait

我的问题与这个问题有关,它已经有了答案:

是的,在线程调用/的操作和由此提交的可运行的 EDT 上的操作之间存在发生之前的关系。invokeLaterinvokeAndWait

我的问题有点笼统:是否甚至可以实现一个方法,invokeAndWait例如 ,使其正常工作,但不强加发生前的关系?通过正常工作的方法,我的意思是:

  • 提交Runnable的保证只执行一次。
  • 提交Runnable在特定线程上执行。
  • 该方法一直等到提交的执行Runnable完成。
  • 该方法保证在提交的执行Runnable完成后返回。

对我来说,如果不强加发生之前的关系,似乎没有办法实现这一点,还是我错了?如果是这样,请包含一个示例实现,以证明这一点。