- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的Java应用程序中,主JTabbedPane
上有一个JFrame
,带有许多JPanel
选项卡。在选项卡中,我有一个功能
public void newStatus(final String arg)
{
Runnable sendMsg = new Runnable()
{
@Override
public void run()
{
mainView.newStatusLine(arg);
}
};
SwingUtilities.invokeLater(sendMsg);
}
JFrame mainView
主函数将一些文本写入
JTextPane
中。我的问题是,这不允许我从主
JFrame
获得返回值。我想做类似的事情
public InfoObj getInfo()
{
Runnable sendMsg = new Runnable()
{
@Override
public void run()
{
return mainView.getInfo();
}
};
SwingUtilities.invokeLater(sendMsg);
}
Runnable.Run
以返回某些内容。
JPanels
自身之间以及在主要
JFrame
和
JPanel
之间进行对话。在某个时候,
JPanel
想要告诉主要
JFrame
做某事,或者它可能想要从中获取一些数据。但是据我所知,我不能仅将
this
的引用传递给
JFrame
或
JPanel
并使用它来调用公共(public)函数或读取其中的任何公共(public)字段。
JPanel
产生了线程,我想将
JPanel
的引用传递给主
JFrame
,以便它可以调用其中的函数来告诉用户有关线程在做什么的信息。
最佳答案
看来您的应用程序数据已全部绑定(bind)到用户界面对象中。如果您可以在EDT上完成所有操作,那么您就可以了。您可以在需要彼此信息的对象之间进行直接调用。由于所有这些都在EDT上,因此它实际上是单线程的,并且没有争用条件或死锁。但是,这可能会导致UI代码的各个部分之间过于紧密地耦合在一起。在这种情况下,您可以使用评论者建议的某种观察者或监听器模式。在单线程,事件驱动的环境(如AWT/Swing)中,这种方法可以很好地工作。
但是然后您说您可能想从EDT之外的其他线程执行此操作。那改变了一切。
(顺便说一句,这是使人们考虑将您的所有应用程序数据绑定(bind)在UI对象内部的方法,这是一种反模式。这使得从UI子系统外部获取这些数据非常困难。 )
您可以添加观察者模式,但是有一些限制。 UI拥有数据,因此只有EDT可以更改数据并将事件触发给观察者。观察者列表需要以线程安全的方式进行维护。大概观察者会希望响应事件而更新数据结构。这些数据结构必须是线程安全的,因为可以从EDT和其他线程访问它们。这种方法是可行的,但是您必须考虑哪些线程正在调用哪些方法,以及哪些数据结构必须是线程安全的。
假设您不想走这条路线,让我们回到原始问题,该问题是关于如何从invokeLater
返回内容。这样做可以让您将数据保留在UI中,同时允许其他线程在需要时从UI中获取数据。可以通过一些间接操作来实现,从而实现。不过,它确实有风险。
这是代码。可以从“其他”(非EDT)线程中调用。
InfoObj getInfo() {
RunnableFuture<InfoObj> rf = new FutureTask<>(() -> getInfoObjOnEDT());
SwingUtilities.invokeLater(rf);
try {
return rf.get();
} catch (InterruptedException|ExecutionException ex) {
ex.printStackTrace(); // really, you can do better than this
}
}
RunnableFuture
是
,,
Runnable
和
Future
的接口(interface)。这很有用,因为
invokeLater
仅接受
Runnable
,但是
Future
可以返回值。更具体地说,
Future
可以捕获一个线程中返回的值并将其存储,直到另一个线程想要获取它为止。
FutureTask
是
RunnableFuture
的方便,现成的实现,它带有
Callable
参数,该函数可以返回值。
FutureTask
并将其传递给将在EDT上运行的一些代码(
Callable
,在此示例中为lambda表达式)。这将收集我们想要的信息并将其返回。然后,我们使用
invokeLater
将其发布到EDT。当另一个线程需要数据时,它可以立即调用
get()
,也可以卡在
Future
上,以后再调用
get()
。
Future.get()
引发了一些您必须处理的已检查异常,这带来了一点不便。
Callable
,则返回值将存储在
Future
中,直到其他线程在其上调用
get()
。如果另一个线程首先调用
get()
,它将被阻塞,直到该值可用为止。
invokeAndWait()
具有相同的风险,即,如果您不小心,则可以使系统死锁。发生这种情况的原因是,调用
get()
的线程可能会阻止等待EDT处理
invokeLater
发布的事件。如果EDT由于某种原因被阻塞(也许正在等待另一个线程持有的东西),则结果将导致死锁。避免这种情况的方法是,在调用可能阻止等待EDT的内容时要格外小心。一个好的通用规则是,在调用这些阻止方法之一时不要持有任何锁。
invokeAndWait
或
invokeLater(FutureTask)
麻烦的示例,请参阅
this question和
my answer。
关于java - 从SwingUtilities.InvokeLater调用中获取返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25635428/
有人可以强调这两者之间的区别以及两者都是必需的实例吗?! 我有一个可以互换使用的应用程序,但想知道一个是否比另一个更好。显然它们都接受 Runnable object,所以对我来说 - 我想我可以使用
EventQueue.invokeLater() 和 SwingUtilities.invokeLater() 有什么不同吗? 或者是后者只是为了设计而建立在前者之上(没有修改)? 最佳答案 没有没有
在我的方法 doWork() 中,我调用 SwingUtilities.invokeLater(new Runnable(){ public void run() { button.setBackgr
我怎么感觉SwingUtilities.invokeLater()在任何swing应用中的必要性。请给出一些代码示例。 最佳答案 每当您需要更新 GUI 中的某些内容时,您应该通过 AWT 事件线程
.addActionListener(new ActionListener(){ public void actionPerformed (ActionEvent e){
我按照教程创建了一个信使。我正确地输入了代码,并且我对所有内容的作用有相当基本的了解。 尽管如此,我最终并没有得到相同的结果。代码如下: public class Server extends JFr
是否有更优雅的方式来完成我在下面所做的事情?也就是说,是否有比轮询和 hibernate 、轮询和 hibernate 等更优雅的方式来知道何时 Runnable.run()方法已通过 invokeL
我在使用 invokeLater 更新 JLabel 值时遇到问题。我在运行 invokeLater 的主函数之外有一个单独的方法,但是当我单击搜索按钮更新值时,它不会在同一个 gui 实例中更新。我
我使用推荐的代码启动我的交互式程序,它使用 Swing。 : public static void main(String[] args) { javax.swing.Swin
EventQueue javadoc 声明要求排队的事件按顺序和顺序分派(dispatch)。 与 EventQueue.invokeLater 一起排队的 Runnable 保证在后续用户事件(例如
有时我觉得使用 AsyncTask 对任务来说太过分了,我正在寻找类似的功能,如 Android 中的 SwingUtilities.invokeLater。因为我只想执行一行代码,没有必要为此创建一
我的问题与 SwingUtilities.invokeLater 有关。我应该什么时候使用它?每次需要更新 GUI 组件时都必须使用吗?它究竟是做什么的?是否有替代方案,因为它听起来不直观并且添加了看
我有一个问题,关于使用 SwingUtilities 的 invokeLater 方法的正确做法是什么。 因此,首先,我想确认我的理解是否正确。 据我所知,必须在 EDT 上更改 GUI,因为 Swi
我有一个线程使用 SwingUtilities.invokeLater 在我的 JFrame 上显示更新。线程的速度是可调的,当它设置为全速(更新之间没有 sleep )时,我的程序会严重减慢。我想问
我从来不理解SwingUtilities.invokeLater,这就是我一直避免使用它直到现在的原因。但是确保 Swing Thread 安全非常重要。好吧,请原谅,因为这是我第一次这样做。我试图在
这个问题已经有答案了: What does SwingUtilities.invokeLater do? [duplicate] (5 个回答) SwingUtilities.invokeLater
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我正在使用 invokeLater() 在 JEditPane 中加载 html 页面,该 JEditPane 位于 JPanel 中,而 JPanel 位于 JTabbedPane 中。 我的所有方
I had a problem earlier我试图将对象添加到 Canvas 中,但 SwingUtilities.invokeLater 尚未真正完成其工作。我确实需要能够可靠地向此 JPanel
我正在尝试使用多线程模拟一个简单的恒温器。恒温器应提高温度以达到用户请求的值,即下面代码中的“最大值”。我有两个线程,一个负责提高温度,另一个负责降低温度。但减少的条件是必须在关气时才运行。但我在实现
我是一名优秀的程序员,十分优秀!