Saturday, December 10, 2022

Zkoss Framework JFree Chart - III [ Candlestick ]

Candlestick 

Source :

1. File Zul :

<vlayout apply="org.zkoss.bind.BindComposer"
    viewModel="@id('vm') @init('demo.chart.candlestick.CandlestickChartVM')">
    <chart id="chart" width="680" height="400"
        yAxis="Price" fgAlpha="128" paneColor="#ffffff"
        type="candlestick"
        model="@bind(vm.model)" engine="@bind(vm.engine)"
        onClick="@command('showMessage',msg=event.areaComponent.tooltiptext)"/>
    <hlayout visible="@bind(not empty vm.message)">
        You clicked on :<label value="@bind(vm.message)"/>
    </hlayout>
</vlayout>


2. View Model :

2.1. candlestickchartVM.java

package demo.chart.candlestick;
 
import java.util.Date;
import java.util.Iterator;
 
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zul.HiLoModel;
import org.zkoss.zul.SimpleHiLoModel;
 
public class CandlestickChartVM {
 
    HiLoModel model;
    CandlestickChartEngine engine;
    String message;
 
    @Init
    public void init() {
        engine = new CandlestickChartEngine();
 
        model = new SimpleHiLoModel();
        Iterator<Object[]> it = ChartData.get().iterator();
        while (it.hasNext()) {
            Object[] data = it.next();
            model.addValue((Date) data[0], (Double) data[1], (Double) data[2],
                    (Double) data[3], (Double) data[4], (Double) data[5]);
        }
    }
 
    public CandlestickChartEngine getEngine() {
        return engine;
    }
 
    public HiLoModel getModel() {
        return model;
    }
     
    public String getMessage() {
        return message;
    }
 
    @Command("showMessage")
    @NotifyChange("message")
    public void onShowMessage(
            @BindingParam("msg") String message){
        this.message = message;
    }
}


2.2. candlestickchartEngine.java

package demo.chart.candlestick;
 
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.CandlestickRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.zkoss.zkex.zul.impl.JFreeChartEngine;
import org.zkoss.zul.Chart;
 
import demo.chart.ChartColors;
 
/*
 * you are able to do many advanced chart customization by extending ChartEngine
 */
public class CandlestickChartEngine extends JFreeChartEngine {
 
    //This method used to define the margin of axis
    protected boolean prepareJFreeChart(JFreeChart jfchart, Chart chart) {
        XYPlot xyplot = (XYPlot) jfchart.getPlot();
        // Define margin of y-axis
        NumberAxis numberaxis = (NumberAxis) xyplot.getRangeAxis();
        numberaxis.setUpperMargin(0.0D);
        numberaxis.setLowerMargin(0.0D);
        // Second axis shows volume
        NumberAxis rangeAxis2 = new NumberAxis("TotalVolume");
        rangeAxis2.setUpperMargin(78410); 
        numberaxis.setAutoRangeIncludesZero(false);
        xyplot.setRangeAxis( 1, rangeAxis2 );
        CandlestickRenderer renderer = (CandlestickRenderer)xyplot.getRenderer();
        renderer.setSeriesPaint(0, ChartColors.COLOR_1);
        renderer.setDownPaint(ChartColors.COLOR_5);
        renderer.setUpPaint(ChartColors.COLOR_2);
         
        return false;
    }
}


3. Model :

3.1. ChartData.java

package demo.chart.candlestick;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
 
public class ChartData {
    static List<Object[]> data = new ArrayList<Object[]>();
    static {
        data.add(new Object[] { time(2010, 5, 6, 13, 57, 0),
                new Double(1116.50), new Double(1119.50), new Double(1115.75),
                new Double(1118.75), new Double(26534) });
        data.add(new Object[] { time(2010, 5, 6, 13, 58, 0),
                new Double(1118.75), new Double(1118.75), new Double(1113.75),
                new Double(1115.50), new Double(22715) });
        data.add(new Object[] { time(2010, 5, 6, 13, 59, 0),
                new Double(1115.75), new Double(1116.00), new Double(1110.75),
                new Double(1112.75), new Double(20766) });
        data.add(new Object[] { time(2010, 5, 6, 14, 0, 0),
                new Double(1112.75), new Double(1112.75), new Double(1103.25),
                new Double(1106.00), new Double(30059) });
        data.add(new Object[] { time(2010, 5, 6, 14, 1, 0),
                new Double(1105.75), new Double(1115.25), new Double(1105.50),
                new Double(1113.00), new Double(20329) });
        data.add(new Object[] { time(2010, 5, 6, 14, 2, 0),
                new Double(1112.75), new Double(1116.50), new Double(1110.50),
                new Double(1116.25), new Double(20395) });
        data.add(new Object[] { time(2010, 5, 6, 14, 3, 0),
                new Double(1116.50), new Double(1121.00), new Double(1115.75),
                new Double(1120.00), new Double(23156) });
        data.add(new Object[] { time(2010, 5, 6, 14, 4, 0),
                new Double(1120.00), new Double(1121.25), new Double(1117.75),
                new Double(1119.00), new Double(22293) });
        data.add(new Object[] { time(2010, 5, 6, 14, 5, 0),
                new Double(1119.00), new Double(1123.50), new Double(1116.75),
                new Double(1123.50), new Double(27369) });
        data.add(new Object[] { time(2010, 5, 6, 14, 6, 0),
                new Double(1123.50), new Double(1124.00), new Double(1120.25),
                new Double(1121.75), new Double(22120) });
        data.add(new Object[] { time(2010, 5, 6, 14, 7, 0),
                new Double(1121.75), new Double(1126.50), new Double(1121.00),
                new Double(1126.00), new Double(24415) });
        data.add(new Object[] { time(2010, 5, 6, 14, 8, 0),
                new Double(1126.25), new Double(1131.25), new Double(1125.50),
                new Double(1131.25), new Double(27627) });
        data.add(new Object[] { time(2010, 5, 6, 14, 9, 0),
                new Double(1131.00), new Double(1131.75), new Double(1125.00),
                new Double(1126.25), new Double(28348) });
        data.add(new Object[] { time(2010, 5, 6, 14, 10, 0),
                new Double(1126.50), new Double(1128.00), new Double(1125.75),
                new Double(1127.75), new Double(18702) });
        data.add(new Object[] { time(2010, 5, 6, 14, 11, 0),
                new Double(1128.00), new Double(1128.00), new Double(1117.50),
                new Double(1118.25), new Double(25499) });
        data.add(new Object[] { time(2010, 5, 6, 14, 12, 0),
                new Double(1118.25), new Double(1122.25), new Double(1117.75),
                new Double(1120.25), new Double(16323) });
        data.add(new Object[] { time(2010, 5, 6, 14, 13, 0),
                new Double(1120.25), new Double(1122.50), new Double(1119.00),
                new Double(1121.25), new Double(11372) });
        data.add(new Object[] { time(2010, 5, 6, 14, 14, 0),
                new Double(1121.25), new Double(1121.75), new Double(1119.25),
                new Double(1119.75), new Double(8121) });
        data.add(new Object[] { time(2010, 5, 6, 14, 15, 0),
                new Double(1119.75), new Double(1121.25), new Double(1118.00),
                new Double(1120.25), new Double(15347) });
        data.add(new Object[] { time(2010, 5, 6, 14, 16, 0),
                new Double(1120.25), new Double(1122.75), new Double(1120.25),
                new Double(1122.00), new Double(12236) });
        data.add(new Object[] { time(2010, 5, 6, 14, 17, 0),
                new Double(1121.75), new Double(1125.50), new Double(1121.00),
                new Double(1125.00), new Double(12052) });
        data.add(new Object[] { time(2010, 5, 6, 14, 18, 0),
                new Double(1125.00), new Double(1125.75), new Double(1118.50),
                new Double(1118.75), new Double(21474) });
        data.add(new Object[] { time(2010, 5, 6, 14, 19, 0),
                new Double(1119.00), new Double(1119.00), new Double(1115.25),
                new Double(1115.75), new Double(20824) });
        data.add(new Object[] { time(2010, 5, 6, 14, 20, 0),
                new Double(1115.75), new Double(1116.00), new Double(1111.75),
                new Double(1112.25), new Double(20310) });
        data.add(new Object[] { time(2010, 5, 6, 14, 21, 0),
                new Double(1112.00), new Double(1113.50), new Double(1108.00),
                new Double(1113.25), new Double(23136) });
        data.add(new Object[] { time(2010, 5, 6, 14, 22, 0),
                new Double(1113.25), new Double(1116.75), new Double(1112.50),
                new Double(1114.50), new Double(13819) });
        data.add(new Object[] { time(2010, 5, 6, 14, 23, 0),
                new Double(1114.75), new Double(1115.50), new Double(1111.50),
                new Double(1112.50), new Double(14484) });
        data.add(new Object[] { time(2010, 5, 6, 14, 24, 0),
                new Double(1112.50), new Double(1113.50), new Double(1111.75),
                new Double(1112.25), new Double(7490) });
        data.add(new Object[] { time(2010, 5, 6, 14, 25, 0),
                new Double(1112.25), new Double(1112.25), new Double(1108.25),
                new Double(1108.50), new Double(14881) });
        data.add(new Object[] { time(2010, 5, 6, 14, 26, 0),
                new Double(1108.25), new Double(1112.00), new Double(1106.50),
                new Double(1107.25), new Double(19247) });
        data.add(new Object[] { time(2010, 5, 6, 14, 27, 0),
                new Double(1107.25), new Double(1111.25), new Double(1106.50),
                new Double(1110.00), new Double(11622) });
        data.add(new Object[] { time(2010, 5, 6, 14, 28, 0),
                new Double(1110.00), new Double(1111.00), new Double(1109.00),
                new Double(1110.50), new Double(8758) });
        data.add(new Object[] { time(2010, 5, 6, 14, 29, 0),
                new Double(1110.50), new Double(1118.00), new Double(1110.00),
                new Double(1117.50), new Double(16857) });
        data.add(new Object[] { time(2010, 5, 6, 14, 30, 0),
                new Double(1117.75), new Double(1122.00), new Double(1116.50),
                new Double(1121.50), new Double(17153) });
    }
     
    public static List<Object[]> get(){
        return data;
    }
 
    private static Date time(int year, int month, int day, int hour,
            int minute, int second) {
        final java.util.Calendar calendar = java.util.Calendar
                .getInstance(TimeZone.getTimeZone("GMT"));
        calendar.set(year, month - 1, day, hour, minute, second);
        final Date result = calendar.getTime();
        return result;
    }
}


3.2. ChartColor.java


Hasil :



Reference : https://www.zkoss.org/zkdemo/chart


Memunculkan Simbol & Emoji Pada OS Mac

  Memunculkan Simbol & Emoji  1. Buka aplikasi Pages / Notes pada Macbook. 2. Klik pada Menubar Edit --> Pilih Emoji and Symbols a...