java - 实时显示动态数据的架构

标签 java multithreading user-interface swing swingworker

执行摘要:使用 Swing 实时显示线程安全的动态数据有哪些合理的架构选择?

详细信息:我最近用 Java 编写了一个多线程、自动交易平台。我说“平台”是因为我通过对虚拟对象进行子类化,使得实现新的和多个交易程序变得非常容易。我已经封装了交易代码,因此我可以在 Swing 应用程序、控制台应用程序或其他应用程序中使用它。目前我正在使用 Swing 前端运行它。

我想说我是 Swing 滥用者而不是用户。不是故意的。开发现代 GUI 并将其与我尚未学习的动态数据集成需要一种特殊的思维。我知道非常基础的知识,例如仅在事件调度线程中更新屏幕。以下是我显示消息的方式(来 self 的 SingleFrameApplication 子类):

 private class PrintTraderMsgTask extends SwingWorker<Void, String>{
    @Override
    protected Void doInBackground() {
        String msg;
        while(!isCancelled()){

               msg = m_data.m_TraderMsgs.poll();
               if(msg!=null){
                  publish(msg);
               }
        }
        return null;
    }

    @Override
    protected void process(List<String> chunks) {
     for (String item: chunks){
         m_view.displayTraderString(item);
     }
    }
}

这里的数据元素只是

public ArrayBlockingQueue<String> m_TraderMsgs;

任何数量的“交易者”(单独的线程)都可能随时粘贴消息。我使用的另一种数据对象类型是ConcurrentHashMap。我在其中收集订单日志、交易记录、价格和其他类型的数据。因此,我试图在这里描绘的图片是大量与时间相关的数据,太多而无法一次显示。

我真正想做的是显示摘要信息并具有向下钻取的能力。现在,我在 JTextAreas 中显示消息,并在一些 JTextFields 中显示其他信息。我可以阅读 JCoolWhatever 并将数据填充到其中。但在开始这条路之前,我想了解其他架构选择。

方法 1:使用 SwingWorkers 获取数据并将其粘贴到位于我的 FrameView 子类中的 JWhatever 中。

方法2:???

...

我们想要:

(1)合理的模块化......足以添加/删除元素而不会破坏我们的夜晚

(2)交互能力,特别是数据量大的下钻能力

谢谢...实时显示一组复杂的动态数据是一个有趣的主题,我希望我们能够进行良好的讨论。

最佳答案

管理分层数据复杂性的一种常见方法是可折叠树。在整个 NetBeans IDE 中使用,org.netbeans.swing.outline.Outline是一个特别通用的实现。 NetBeans 在多个窗口中使用它,包括项目、导航器、文件、服务等。因为它派生自 javax.swing.JTable,所以通常的 Editors and Renderers机制可用。文章Announcing the new Swing Tree Table展示了如何使用它来建模文件系统。虽然 org-netbeans-swing-outline.jar 包含在 IDE 中,但它可以单独使用。

附录:

"Drill down" could be clicking on the trading program triggering the display of all its trades in another pane.

JSplitPane在这种情况下很有用:一个 Pane 可能包含树,而另一个 Pane 则显示所选节点/行的扩展详细信息。

关于java - 实时显示动态数据的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689718/

相关文章:

java - Jelastic 上多应用一个数据库场景的最佳配置

java - 线程完成执行后是否会通知另一个加入的线程?

c# - .NET 中的后台线程

java - 使用 Eclipse (Java) 创建 GUI

html - 从 Adob​​e XD 转换 HTML/CSS

java - 如何将用户输入添加到ArrayList?

java - 在java错误中从google plus获取个人资料信息

javascript - 与 Backbone 配合良好的 UI 移动框架?

java - 使用 nunit 使用 jni4net 桥接代码运行测试

java - 原子地获取多个锁