gpt4 book ai didi

java - 如何将 Swing 模型与快速变化的 "real"模型同步?

转载 作者:太空狗 更新时间:2023-10-29 22:46:47 27 4
gpt4 key购买 nike

众所周知,任何与 Swing 组件相关的事情都必须在 the event dispatch thread 上完成。 .这也适用于 models在组件后面,例如TableModel .在基本情况下很容易,但如果模型是必须在单独线程上运行的东西的“实时 View ”,因为它变化很快,事情就会变得相当复杂。例如,JTable 上股票市场的实时 View 。股票市场通常不会在美国东部时间发生。

那么,什么是更好的模式来耦合(分离)必须在 EDT 上的 Swing 模型,以及必须随时随地更新的“真正的”线程安全模型?一种可能的解决方案实际上是 split the model分为两个单独的副本:“真实”模型加上它的 Swing 对应物,它是“真实”模型的快照。然后,它们会不时地(双向)在 EDT 上同步。但这感觉就像膨胀。这真的是唯一可行的方法吗,还是有任何其他或更标准的方法?有用的图书馆?有什么事吗?

最佳答案

我可以推荐以下方法:

  • 将应该修改表的事件放在“待定事件”队列中,当事件放在队列中时并且队列为空然后调用事件调度线程来排空队列所有事件并更新表模型。此优化意味着您不再为接收到的每个事件调用事件分发线程,这解决了事件分发线程跟不上底层事件流的问题。
  • 避免在调用事件分配线程时创建新的 Runnable,方法是使用无状态内部类来耗尽表格面板实现中的待处理事件队列。
  • 可选的进一步优化:在耗尽待处理事件队列时,通过记住哪些表行需要重新绘制然后在处理完所有事件后触发单个事件(或每行一个事件)来最大程度地减少触发的表更新事件的数量。<

示例代码

public class MyStockPanel extends JPanel {
private final BlockingQueue<StockEvent> stockEvents;

// Runnable invoked on event dispatch thread and responsible for applying any
// pending events to the table model.
private final Runnable processEventsRunnable = new Runnable() {
public void run() {
StockEvent evt;

while ((evt = stockEvents.poll() != null) {
// Update table model and fire table event.
// Could optimise here by firing a single table changed event
// when the queue is empty if processing a large #events.
}
}
}

// Called by thread other than event dispatch thread. Adds event to
// "pending" queue ready to be processed.
public void addStockEvent(StockEvent evt) {
stockEvents.add(evt);

// Optimisation 1: Only invoke EDT if the queue was previously empty before
// adding this event. If the size is 0 at this point then the EDT must have
// already been active and removed the event from the queue, and if the size
// is > 0 we know that the EDT must have already been invoked in a previous
// method call but not yet drained the queue (i.e. so no need to invoke it
// again).
if (stockEvents.size() == 1) {
// Optimisation 2: Do not create a new Runnable each time but use a stateless
// inner class to drain the queue and update the table model.
SwingUtilities.invokeLater(processEventsRunnable);
}
}
}

关于java - 如何将 Swing 模型与快速变化的 "real"模型同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1742325/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com