- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 JavaFX 8 应用程序,希望允许一个任务修改两个不同的 UI 元素。据我了解,如果我要修改单个标签,我可以使用 mylabel.textProperty().bind(mytask.messageProperty()) 绑定(bind)到标签,并在任务中使用 updateMessage()。
如何使用两种不同的任意类型来做到这一点?我查看了并发和 JavaFX 文档中的示例,但对我来说它们并没有很好地解释这一点。
我理解任务本身具有消息(字符串)、进度(双/长)、标题(字符串)和值(用户定义)属性,但是如果我想要两个或更多任意类型 我自己的用于控制 UI 元素的属性? (并希望避免使用 runLater()。)
我可以在任务上创建任意属性吗?我觉得我遗漏了一些明显的东西。
最佳答案
建议
如果您的任务需要自定义属性的属性样式界面,请仅使用以下解决方案。通常,许多应用程序不需要这样的接口(interface)和单个 Platform.runLater调用而不是公开自定义属性就足够了。
解决方案
您可以使用与 message property 相同的成语的 Task .我只是将相关代码复制并粘贴到这个答案中。请注意,此解决方案将通过 AtomicReference 来“合并更新,这样我们就不会淹没事件队列”。 .此解决方案不违背 JavaFX 的一般绑定(bind)性质,如果使用过于频繁,也不会导致主线程产生大量消息。但是,因为它合并了更新,所以并非对属性的每次更新都会触发属性更改。每个 pulse 最多只触发一次属性更改.
private final StringProperty message = new SimpleStringProperty(this, "message", "");
@Override public final String getMessage() { checkThread(); return message.get(); }
@Override public final ReadOnlyStringProperty messageProperty() { checkThread(); return message; }
/**
* Used to send message updates in a thread-safe manner from the subclass
* to the FX application thread. AtomicReference is used so as to coalesce
* updates such that we don't flood the event queue.
*/
private AtomicReference<String> messageUpdate = new AtomicReference<>();
/**
* Updates the <code>message</code> property. Calls to updateMessage
* are coalesced and run later on the FX application thread, so calls
* to updateMessage, even from the FX Application thread, may not
* necessarily result in immediate updates to this property, and
* intermediate message values may be coalesced to save on event
* notifications.
* <p>
* <em>This method is safe to be called from any thread.</em>
* </p>
*
* @param message the new message
*/
protected void updateMessage(String message) {
if (isFxApplicationThread()) {
this.message.set(message);
} else {
// As with the workDone, it might be that the background thread
// will update this message quite frequently, and we need
// to throttle the updates so as not to completely clobber
// the event dispatching system.
if (messageUpdate.getAndSet(message) == null) {
runLater(new Runnable() {
@Override public void run() {
final String message = messageUpdate.getAndSet(null);
Task.this.message.set(message);
}
});
}
}
}
// This method exists for the sake of testing, so I can subclass and override
// this method in the test and not actually use Platform.runLater.
void runLater(Runnable r) {
Platform.runLater(r);
}
// This method exists for the sake of testing, so I can subclass and override
// this method in the test and not actually use Platform.isFxApplicationThread.
boolean isFxApplicationThread() {
return Platform.isFxApplicationThread();
}
其他问题的答案
this is the source code from class Task?
是的。这是 source code from Task .
So you're saying the only way is to extend the Task class with additional properties like is done in Task above?
好吧,如果您希望自定义任务中的自定义属性可以同时修改,那么是的,您需要对任务进行子类化。但这与将自定义属性添加到您定义的任何其他类(或扩展另一个现有类以添加属性)并没有太大区别。唯一的区别是额外的机制可确保在正确的线程上执行并在需要时合并。
Second topic, you also seem to say at the start that occasionally calling runLater is an acceptable way to do it?
是的,Platform.runLater()是在任务和 JavaFX UI 线程之间发送消息的推荐方式(如 Task javadoc 中所示)。
这些属性提供了任务和对象之间的松散耦合,这些对象可能通过 observer pattern 依赖于任务。 .如果您不需要松散耦合,那么您就不需要特别需要属性(尽管它们有时很有用且易于绑定(bind),因为 JavaFX API 的其余部分(例如标签的文本)是基于属性的) .
关于JavaFX : two bound properties for Task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36020573/
在许多在线资源中,可以找到“内存”、“带宽”、“延迟”绑定(bind)内核的不同用法。在我看来,作者有时会使用他们自己对这些术语的定义,我认为这对某人做出明确区分非常有益。 据我了解:带宽绑定(bin
FIFO、LIFO 和LC Branch and Bound 有什么区别? 最佳答案 Branch & Bound 通过使用估计边界来限制可能解决方案的数量来发现完整搜索空间内的分支。不同的类型(FI
我有一个网页,其中有一些 Kendo 控件(例如下拉菜单和按钮)可以正常工作,但是添加Grid 会导致问题。 @(Html.Kendo().Grid(Model).Name("grid").Colu
术语“CPU 限制”和“I/O 限制”是什么意思? 最佳答案 这非常直观: 如果 CPU 更快,程序就会运行得更快,即程序的大部分时间只是使用 CPU(进行计算),则该程序是 CPU 密集型。 计算
我在以下代码段中遇到问题并发出警告,希望您能帮助我: fprintf (fp, "%dd%d+%d ", pMobIndex->mana[DICE_NUMBER], DICE_NUMBER 在我
swift 2 let gap = CGFloat(randomInRange(StackGapMinWidth...maxGap)) Missing argument label 'range:'
swift 2 let gap = CGFloat(randomInRange(StackGapMinWidth...maxGap)) Missing argument label 'range:'
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 6 年前。 这个问题是由于打字错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在
我想在gcc8.2下启用数组边界检查,这样可以帮助在编译期间检查数组下标是否越界,它可能会给出如下警告:数组下标高于数组边界 [-Warray-bounds] 我使用 coliru 做了一个演示: #
我只是想知道在 Apple API 中的什么地方定义了变量“bounds.minX”、“bounds.maxX”?我查看了“UIView”和“CGRect”文档,但似乎找不到它? 最佳答案 它包含在"
我想覆盖整个屏幕。我想将其框架设置为覆盖整个屏幕。浏览堆栈溢出时,我发现了这两种不同的设置 View 框架以覆盖屏幕的方法: [UIScreen mainScreen].bounds [UIApplc
在协程中执行 IO 绑定(bind)函数(例如,从后端请求数据)给了我一个优势,即在请求结果可用之前暂停它的执行,对吗?但是,受 CPU 限制的函数(例如,解析一个巨大的文本文件)不会“等待”任何东西
public class ChampionsLeague> extends League{ ... 如何创建此类的实例? ChampionsLeague league = new ChampionsL
我遇到了以下问题: 我有这些类和接口(interface)定义 public abstract class ViewModelRefreshPostListFragment> extends
我注意到在使用 (Swift 4.0) 的 IOS X 代码中,我至少可以通过以下两种方式请求 View 的高度 V: V.bounds.size.height 和... V.bounds.heigh
swift 中 bounds.size.width 和 bounds.width 有什么区别?他们会返回同样的东西吗?谢谢! 最佳答案 bounds 是 UIView 的 CGRect 结构属性,其中
在我看来不可能包含 Integer.MAX_VALUE和Long.MAX_VALUE创建 IntStream 时尽可能使用随机值或LongStream使用 java.util.Random 的边界类。
我有二叉树类: public class BinaryTree> extends AbstractTree { protected TreeNode root;
我最近做了并更新了我的 Xamarin iOS 项目,我曾经能够调用以下代码来检索屏幕宽度和高度: if (orientation == UIInterfaceOrientation.Landscap
我仍然不明白为什么我收到这个警告 array subscript is above array bounds [-Warray-bounds] 对于一个小的 C 代码如下: #include #in
我是一名优秀的程序员,十分优秀!