写一点最近的东西。。。(是有多久没来了

原创 2016年04月14日 15:41:25
ddl是第一生产力,此言不虚,ddl过后偶然想把一些东西mark down ,纪念最近ddl下支配的恐惧【哭笑】

界面近来一直用javafx来写,对fx的整体框架清晰了不少(特别是不依赖scene builder进行类似于swing的界面编写),主要说一下fx中图表的特点吧。


关于javafx画图

fx里的图表是基于一个个series来显示其中的内容,包括series下的数据和node(可以理解成一棵树,最上面是Group,下面可以放各种node),然后需要在chart的data中放入事先定义的series(当然series也有getData方法得到之前塞进去的数据,这些数据就是用来显示的)

chart.getData().add(series)

Data<String , Number> data = series.getData();

关于Data,构造方法最多只有3个参数,如果需要自定义比较复杂的显示,就把除了x,y值之外的东西打成一个Javabean放到第三个参数里,之后绘图的时候再取出来用(用fx自带的图表应该直接用就行了不像自己画得那么麻烦)

/**
         * Creates an instance of XYChart.Data object and initializes the X,Y
         * data values and extraValue.
         *
         * @param xValue The X axis data value.
         * @param yValue The Y axis data value.
         * @param extraValue Chart extra value.
         */
        public Data(X xValue, Y yValue, Object extraValue) {
            setXValue(xValue);
            setYValue(yValue);
            setExtraValue(extraValue);
            setCurrentX(xValue);
            setCurrentY(yValue);
            setCurrentExtraValue(extraValue);
        }

然后是关于创建图的执行顺序:
先是调用series的add方法,然后调用item的add方法把node塞进series,第一个series塞完后再add第二个series,以此类推。
然后等series塞完后更新坐标轴范围,调用updateAxisRange方法,这个不一定要重写看需要吧。
最后调用layoutPlotChildren方法,相当于是在画布上设置一个个node的位置把它画出来,算是显示最关键的一步。

@Override
        protected void dataItemAdded(Series<String, Number> series,
                int itemIndex, Data<String, Number> item) {

            Node candle = creatNode(item);
            getPlotChildren().add(candle);
        }

        @Override
        protected void dataItemRemoved(Data<String, Number> item,
                Series<String, Number> series) {

        }

        @Override
        protected void dataItemChanged(Data<String, Number> item) {

        }

        @Override
        protected void seriesAdded(Series<String, Number> series,
                int seriesIndex) {
            if(seriesIndex == SPECTIALINDEX)
                for (Data item : series.getData()) {

                    Node kNode = creatNode(item);

                    getPlotChildren().add(kNode);

                }

            }

            else {

                Path path = new Path();

                series.setNode(path);

                getPlotChildren().add(path);

            }

        }


        @Override
        protected void seriesRemoved(Series<String, Number> series) {

            Path path = (Path) series.getNode();

            path.setVisible(false);

        }
        @Override
        protected void layoutPlotChildren() {
            if (getData() == null) {

                return;

            }
            .......(略过)
        }

        @Override
         protected void updateAxisRange() {
            ........
         }

继承XYChart的自定义图表需要实现series的增删方法和series中item 的增删改方法(必须有series增加和item增加啊不然没东西显示)。当然还有layoutPlotChildren。一般自己动手画也就是把一些元素组合起来,比如k线图就是各类path再加bar(Region),然后bar上加一条线(Line)。PS:也是参考demo的。


关于lambda表达式

算是尝试着在java中用lambda写点东西,特别是双目符号(::)的使用(java中应该也叫这个吧)顿时feel到了c++的函数指针用法。


一般在fx的initialize方法中设定对应关系都会用lambda表达式

peColumn.setCellValueFactory(cell -> newSimpleDoubleProperty(cell.getValue().pe));

pbColumn.setCellValueFactory(cell -> new SimpleDoubleProperty(cell.getValue().pb));

参数和返回值的对应关系。。我暂时这样理解。在做监听的时候也省去了匿名内部类

choiceBox.getSelectionModel().selectedItemProperty()
    .addListener((observable, oldValue, newValue) -> {
                    calculate();
                });

类似的还用过lambda写线程等等,应用的方面挺多。


调用逻辑层方法的遇到了一个问题,一些接口的参数列表和返回值都是相同的,比如根据起始终止条件得到一个Collection<…>。每次判断再显式调用方法就显得很冗余,扩展性不好。于是就试着用::

interface MACDSource {
        Collection<MacdVO> getData(String stockCode, LocalDate startDate,
                LocalDate endDate) throws NetworkConnectionException;
    }

    /**
     * 获得MACD数据
     */
    private void getMACDData(LocalDate startDate, LocalDate endDate,
            MACDSource source) {
        Collection<MacdVO> macdVOs = null;
        try {
            macdVOs = source
                    .getData(stockVO.getStockCode(), startDate, endDate);
        } catch (NetworkConnectionException e) {
            new NetExceptionTips("Please check the net");
            e.printStackTrace();
        }
        ...
    }

逻辑层的接口

/**

     ...
     */
    Collection<MacdVO> getMacdD(String stockCode, LocalDate begin, LocalDate end) throws NetworkConnectionException;
    Collection<MacdVO> getMacdW(String stockCode, LocalDate begin, LocalDate end) throws NetworkConnectionException;
    Collection<MacdVO> getMacdM(String stockCode, LocalDate begin, LocalDate end) throws NetworkConnectionException;

声明的interface里只有一个方法,保证参数列表和返回值和需要实际调用的方法相同。这样,就可以把传入这个接口,把接口当成一个函数指针,用::的方式表明这个地方传入的是哪个函数的“指针”

getMACDData(beginDate, endDate, stockAnalysis::getMacdW);

getMACDData(beginDate, endDate, stockAnalysis::getMacdD);

这样就算之后有变动也好处理很多。


    anyway,暂时想到这些。然后,身体最重要,远离ddl。。。

相关文章推荐

csdn,好久没来了,从今天起陆续写写自己人生经历中的几个抉择.

    人的一生会经历诸多的抉择,虽说每一个抉择都无所谓对错,但对自己的影响也是举足轻重的.希望自己的每一次抉择都能让自己满意.下面先来讲讲大四毕业时候的这个抉择. 曾记得,06年底,时为大四的自己,...
  • shunan
  • shunan
  • 2011年06月09日 22:01
  • 628

产品三步曲(好久好久没来了,发一篇,表示我还在关心这里)

产品必问:1、产品的价值是什么?2、用户是谁?3、需求规模多大?4、竞争情况与同类产品有哪些?5、商业模式是什么?6、团队成员和优势有哪些?7、打算怎么推广?8、可能有哪些风险? 用清晰简洁的言语回答...

好久没来,发现最近客户对京东怨言…

好久没来,发现最近客户对京东怨言很多,就拿这个版块来说,第一页35条贴子就有6条对京东很失望的,占了17%,这个比例非常惊人,如果东京不重视,立即采取有效措施。恐怕迟早要出事。个人总结了一下主要有一下...

最近写一个涉及到打印IC的软件。写一些东西以免以后忘记;

1、 读写S50 IC卡注意事项 S50 IC卡共分为 16个扇区,每个扇区有4个块; 其中 每个扇区的 1、2、3 是可写的,每块可写16个字符。 第一扇区的1、2、3块为保留(或许)区块。第...
  • aroc_lo
  • aroc_lo
  • 2013年04月13日 22:56
  • 657

关于SQL注入检测写一点东西

背景,为什么这么做其实我一直搞不清楚 CSDN论坛上发的帖子 最近在帮老师做一个项目,整个系统是进行数据库访问审计用的。具体说系统用于服务器和数据库之间,对所有从服务器提交的查询数据库...

从基础开始写吧,写一下这段日子学到的一点东西!

从小白开始进入公司,一开始连最基本的web项目创建都不会,到现在算是可以熟练使用struts框架,总算有点进步了, 首先说一下struts项目创建吧,我将创建struts框架的项目分为了四步:拿my...

很久没来,丢一份前阵子做的 10 万连接性能测试 (fibjs, golang, nginx, nodejs)

测试内容 动态HTTP服务器极限性能,分为两项: 优化前后的各版本fibjs优化后的fibjs、使用cluster的nodejs、基于模块的nginx、使用多核的go 测试环境及方法 服务...

Android 7.0来的真快,来看看又来了些什么出人意料的东西(墙外搬运)

转载请注明出处:王亟亟的大牛之路先安利,本周会完成工具类等模块的拆分,敬请期待:https://github.com/ddwhan0123/Useful-Open-Source-Android最近都在...

就今天!阿里黑科技来了:不排队结账_拿了东西就走人

原文链接 摘要: 在工作生活节奏日益加快的今天,请问亲爱的你平时觉得什么事儿可以更高效点儿? 个人觉得排队这件小事可以改进改进,毕竟每天去食堂吃饭看乌央乌央的队伍心里就有点堵,周五下班去超市...

就今天!阿里黑科技来了:不排队结账_拿了东西就走人!

原文链接 摘要: 在工作生活节奏日益加快的今天,请问亲爱的你平时觉得什么事儿可以更高效点儿? 个人觉得排队这件小事可以改进改进,毕竟每天去食堂吃饭看乌央乌央的队伍心里就有点堵,周五下班去...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:写一点最近的东西。。。(是有多久没来了
举报原因:
原因补充:

(最多只允许输入30个字)