用于实时显示动态数据的体系结构

时间:2010-09-11 03:41:24

标签: java multithreading user-interface swing swingworker

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

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

我会说我是Swing滥用者而不是用户。不是故意的。开发现代GUI并将其与我尚未学习的动态数据集成在一起需要特殊的思考。我知道非常基础知识,例如仅在事件调度线程中更新屏幕。以下是我显示消息的方式(来自我的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获取数据并将其粘贴到驻留在JWhatever子类中的FrameView中。

方法2 :???

...

我们希望:

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

(2)交互能力,特别是向下钻取能力,因为有太多的数据

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

2 个答案:

答案 0 :(得分:2)

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

附录:

  

“向下钻取”可能会点击交易程序,触发另一个窗格中所有交易的显示。

JSplitPane在此上下文中很有用:一个窗格可能包含树,而另一个窗格显示所选节点/行的扩展详细信息。

答案 1 :(得分:1)

JIDE Grids有几种类型的分层表。我只用过树表。 “分层表(示例1)”屏幕截图似乎与您想要的非常接近:

alt text