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

原创 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。。。

我多久没来了啊

我多久没来了啊
  • Angelababyin
  • Angelababyin
  • 2011年08月26日 21:50
  • 202

有多久没回来了?

一地灰尘,应该打扫打扫了。
  • cyberHunK
  • cyberHunK
  • 2007年07月30日 10:52
  • 575

有段时间没来了

 很久没再上CSDN了,回来看看。发现变化很大。
  • Santos
  • Santos
  • 2009年05月16日 21:06
  • 261

张小龙:突然搭错了神经,写了个邮件,微信就此开始!

文/王冠雄   这是腾讯的内部复盘,真正的超级干货。作者深入微信团队,围绕微信产品诞生与继续完善,从产品开发、团队工作、品牌推广、流程等方面进行了深入研究。"互联网的一些事"特意推荐此篇文章带你了解...
  • u013792509
  • u013792509
  • 2014年03月03日 09:02
  • 791

上周技术关注:Atlas实现机制浅析

[ajax; Atlas] Atlas 实现机制浅析[1] # 与 .NET 和 Java 平台下其它 AJAX 框架相比,Altas 最大的亮点就在于与 ASP.NET 现有机制的无缝融合。...
  • zdg
  • zdg
  • 2006年02月20日 03:03
  • 5428

我自己设计的中文分词算法

http://xiecc.itpub.net/post/1476/52479 最近折腾毕业论文,搞得人没心情写blog了。于是觉得不如把毕业论文里的东西贴出来当blog算了。这里主要介绍了我自己的中文...
  • jiljil
  • jiljil
  • 2008年04月28日 15:17
  • 404

写一点无关紧要的东西

初三了,一统完挂神**瞎搞,各种颓。被骂了一顿,各种后悔无奈心痛。过去的不再来先给自己立一个flag加油(怎么这么小??)这个天地,我来过,我奋战过,我深爱过,我不在乎结局。我要这天,再遮不住我眼,这...
  • HeroDeathes
  • HeroDeathes
  • 2017年09月22日 21:15
  • 127

随便写的一点东西

终于要开始写博客了(终于有了博客并假装开始写) 一直都没有写点题解啊之类的习惯(从来是代码写好就扔) 写点我自己看看呗(大概也只有我自己会看) 嗯 以下是正经的一开始学OI就是为了玩玩电脑吧。。...
  • ymzqwq
  • ymzqwq
  • 2017年09月25日 15:19
  • 61

有一段时间没来了哦

好在今天有空可以来看看,想想确实有几天没有过来看看了,昨天去了临安了看丁,明天又要上班,也就很快回来了,顺便去了书店看了一个下午的来书,感觉小激动。自己真的需要更加努力,否则,自己既定的目标就达不到了...
  • lishan1998
  • lishan1998
  • 2013年08月01日 14:48
  • 232

明知是广告,却欲罢不能?!好软文,就是这么来的

硬广的时代已经过去了,就算你的产品再好,一篇纯广告还是会引起别人的反感,甚至有可能这篇广告,会被论坛主、贴吧吧主等一删而后快。被删的文案,就算价值再好,内容再吸引人也是没用的,因为别人点进去的时候已经...
  • weiwei_2016
  • weiwei_2016
  • 2016年06月16日 15:14
  • 397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:写一点最近的东西。。。(是有多久没来了
举报原因:
原因补充:

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