Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Friday, January 6, 2023

Setting Plugin Android Pada IDE Netbeans

 


Berikut adalah cara menambahkan plugin Android :

1  Install Android SDK : Link Download

1.1. Download file android-sdk_r10-windows.zip, lalu ekstrak di direktori C:\. ( C:\android-sdk-windows ). Setelah itu jalankan file “SDK setup.exe”,  Jika ada package yang belum ada di komputer maka akan muncul window konfirmasi “Choose Packages to Install”, pilih “Accept All”, lalu klik Install

1.2. Jika terdapat masalah saat menambahkan package tersebut karena defaultnya SDK manager akan menggunakan saluran https (saluran secure SSL), maka setting SDK manager dengan memilih menu Settings --> “Force https//...sources to be fetched using http//...” 


2.  Menambahkan Android plugins ke Netbeans IDE

2.1. Buka Netbeans IDE, pilih menu Tools --> Plugins, didalam window Plugins pilih tab Settings dan tekan tombol Add dan masukkan nama plugin serta address URL tersebut dan klik tombol ‘OK’

2.2. Pada tab Available Plugins ketikkan android pada text field Search untuk mencari nama item Android, tandai centang pada item nama Android, lalu  klik Install

2.3. Kemudian klik Next

2.4. Centang Accept ... lalu klik  Install

2.5. Klik Continue ( biarkan peringatan mengenai unsigned plugin )


2.6. Selanjutnya tambahkan android platform ke Netbeans IDE.  buka aplikasi Netbeans IDE, pilih menu Tools --> Java Platform, kemudian tekan tombol Add Platform... kemudian tandai radio button pada Google Android Open Handheld Platform lalu klik Next

2.7. Pada window Choose Platform Folder browse ke folder tempat SDK Android berada (C:\android-sdk-windows). Kemudian klik Next

2.8. Pada window Add Java Platform, pilih Android 1.6 Standard Android platform...;1.6 ( jika aplikasi dicompile dengan target android versi rendah maka kemungkinan jalan di versi android lebih tinggi ). Kemudian pilih target compiler sesuai versi android handphone yang dimiliki (jika versi android froyo maka pilih Android 2.2 Standard Android platform..;2.2). kemudian klik Finish. 

2.9. Kemudian klik Close.

 Catatan : Gunakan cara yang sama untuk menambahkan Java Platform Android versi lainnya (misal Versi Android 2.2).


3.  Membuat Android Virtual Device (AVD)

Android Virtual Device digunakan oleh Netbeans IDE untuk menampilkan hasil running dari program yang dibuat, jika AVD belum dibuat maka akan muncul window permintaan AVD oleh Netbeans IDE. AVD merupakan Virtual Device untuk Handphone Android yang berada komputer. 

3.1. Jalankan aplikasi SDK Manager.exe yang ada di folder C:\android-sdk-windows\SDK Manager atau klik 2x shortcut pada desktop. Kemudian pilih menu “Virtual devices” dan klik New.

3.2. Kemudian akan terbuka window “Create new Android Virtual Device”

Keterangan :

  • Name : beri nama android device  (contoh : HapeDroid2.2)
  • Target : pilih OS Android version sesuai yang tambahkan pada Netbean IDE ( Android 2.2)
  • SD Card Size : SD Card (Memory Card) Virtual untuk AVD. isikan kapasitas 1000MiB (1Gb).
  • Skin : pilih screen resolution yang telah tersedia atau membuat custom resolution sesuai dengan Hape Android. pilih WVGA800 (800x480), karena inilah screen resolution sebagian besar Hp android. Untuk Android Tablet, membuat screen resolution jadi 1024x600.
  • Hardware : ini dipilih secara otomatis..

Setelah itu,  klik “Create AVD” dan klik OK pada window “Result of creating AVD ‘HaPeDroid2.2’:”


Untuk menjalankan AVD, pilih/sorot dan kemudian klik tombol Start. 

3.3. Jendela Pilihan Peluncuran akan terbuka, untuk mengatur skala tampilan dan Wipe User Data. Jika tampilan window AVD terlalu kecil anda bisa men-centang “Scale display to real size” dan set nilai Screen size (in) = 4 atau 5 ( ukuran window default ),  lalu klik Launch untuk memulai AVD tersebut.


Keterangan :

Sebelah kiri tampilan android, sebelah kanan merupakan tombol navigasi dan keyboard virtual. 

Berikut adalah shortcut untuk membantu menggunakan keyboard komputer untuk menjalankan AVD :

Home
Go to the Home Screen
F2
Menu Button
ESC
Back Button
F6
Toggle Trackball Mode
Ctrl+F5
Increase Volume
Ctrl+F6
Decrease Volume
Ctrl+F11
Switch Between Portrait and Landscape Mode
Alt+Enter
Toggle Full-Screen Mode

3.4. Ujicoba AVD Android 

Sudah terkoneksi ke internet. kemudian klik web browser ikon di layar AVD.


4  Membuat  project Android  di Netbeans IDE

4.1. Buka Netbeans IDE, pilih menu File-->New Project... kemudian pilih Android paltform

4.2. Isikan Project Name dan field yang lain. Pilih Android Platform. Kemudian klik Finish.


4.3. Pada file : MainActivity.java, tambahkan script :

package org.me.hellodroid;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

/* @android with netbeans */

public class MainActivity extends Activity {

    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);

        TextView tv = new TextView(this);

        tv.setText("Hello ini adalah Android");

        setContentView(tv);

    }

}

4.4. Selanjutnya run program tersebut , maka Netbeans IDE akan otomatis memanggil AVD


Catatan :

Jalankan AVD lebih dahulu untuk menghemat waktu AVD melakukan booting start sehingga lebih cepat melihat output program.


Thursday, January 5, 2023

Membuat Google Maps Menggunakan Java Swing

 


1. Buat file : map.html

<!DOCTYPE html>

<html>

<head>

   <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>

   <style type="text/css">

       html { height: 100% }

       body { height: 100%; margin: 0; padding: 0 }

       #map-canvas { height: 100% }

   </style>

   <script type="text/javascript"

           src="https://maps.googleapis.com/maps/api/js?key=API_KEY"></script>

   <script type="text/javascript">

     var map;

     function initialize() {

       var mapOptions = {

         center: new google.maps.LatLng(48.209331, 16.381302),

         zoom: 4

       };

       map = new google.maps.Map(

              document.getElementById("map-canvas"), mapOptions);

     }

     google.maps.event.addDomListener(window, 'load', initialize);


   </script>

</head>

<body>

<div id="map-canvas"></div>

</body>

</html>


2. Buat file java 

2.1. Standard  

import static com.teamdev.jxbrowser.engine.RenderingMode.HARDWARE_ACCELERATED;

import com.teamdev.jxbrowser.browser.Browser;

import com.teamdev.jxbrowser.engine.Engine;

import com.teamdev.jxbrowser.engine.EngineOptions;

import com.teamdev.jxbrowser.view.swing.BrowserView;

import java.awt.BorderLayout;

import javax.swing.JFrame;

import javax.swing.SwingUtilities;

public class GoogleMaps {

    public static void main(String[] args) {

        EngineOptions options =

                EngineOptions.newBuilder(HARDWARE_ACCELERATED).build();

        Engine engine = Engine.newInstance(options);

        Browser browser = engine.newBrowser();

        SwingUtilities.invokeLater(() -> {

            BrowserView view = BrowserView.newInstance(browser);

            JFrame frame = new JFrame("Google Maps");

            frame.add(view, BorderLayout.CENTER);

            frame.setSize(800, 500);

            frame.setVisible(true);

            browser.navigation().loadUrl("file:///Users/me/map.html");

        });

    }

}

2.2.  Plust Zoom

import static com.teamdev.jxbrowser.engine.RenderingMode.*;

import com.teamdev.jxbrowser.browser.Browser;

import com.teamdev.jxbrowser.engine.Engine;

import com.teamdev.jxbrowser.engine.EngineOptions;

import com.teamdev.jxbrowser.view.swing.BrowserView;

import java.awt.BorderLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;

public class GoogleMaps {

    private static final int MIN_ZOOM = 0;

    private static final int MAX_ZOOM = 21;

    private static final String setMarkerScript =

            "var myLatlng = new google.maps.LatLng(48.4431727,23.0488126);\n" +

                    "var marker = new google.maps.Marker({\n" +

                    "    position: myLatlng,\n" +

                    "    map: map,\n" +

                    "    title: 'Hello World!'\n" +

                    "});";

    /**

     * In map.html file default zoom value is set to 4.

     */

    private static int zoomValue = 4;

    public static void main(String[] args) {

        EngineOptions options =

                EngineOptions.newBuilder(HARDWARE_ACCELERATED).build();

        Engine engine = Engine.newInstance(options);

        Browser browser = engine.newBrowser();

        SwingUtilities.invokeLater(() -> {

            BrowserView view = BrowserView.newInstance(browser);

            JButton zoomInButton = new JButton("Zoom In");

            zoomInButton.addActionListener(e -> {

                if (zoomValue < MAX_ZOOM) {

                    browser.mainFrame().ifPresent(frame ->

                            frame.executeJavaScript("map.setZoom(" +

                                    ++zoomValue + ")"));

                }

            });

            JButton zoomOutButton = new JButton("Zoom Out");

            zoomOutButton.addActionListener(e -> {

                if (zoomValue > MIN_ZOOM) {

                    browser.mainFrame().ifPresent(frame ->

                            frame.executeJavaScript("map.setZoom(" +

                                    --zoomValue + ")"));

                }

            });

            JButton setMarkerButton = new JButton("Set Marker");

            setMarkerButton.addActionListener(e ->

                    browser.mainFrame().ifPresent(frame ->

                            frame.executeJavaScript(setMarkerScript)));

            JPanel toolBar = new JPanel();

            toolBar.add(zoomInButton);

            toolBar.add(zoomOutButton);

            toolBar.add(setMarkerButton);

            JFrame frame = new JFrame("Google Maps");

            frame.add(toolBar, BorderLayout.SOUTH);

            frame.add(view, BorderLayout.CENTER);

            frame.setSize(800, 500);

            frame.setVisible(true);

            browser.navigation().loadUrl("file:///Users/me/map.html");

        });

    }

}


Catatan : Library JxBrowser 

Download Trial JxBrowser selama 30 hari, lalu di extrak. Perlu mendapatkan license dari JxBrowser dengan cara evaluate, nanti license akan dikirim melalui email yang digunakan untuk mendaftar pastikan juga license yang dikirim didownload. Setelah extrak,  setelah itu import library JxBrowser. Jika untuk windows file jxbrowser-6.14.1 dengan jxbrowser-win32-6.14.1, jika linux pilih jxbrowser-linux32-6.14.1 atau jxbrowser-linux64-6.14.1 dan untuk mac os jxbrowser-mac-6.14.1.

Wednesday, January 4, 2023

Membuat Restful Web Service Menggunakan Java

 


Pada artikel ini menggunakan tools Netbeans dengan server GalssFish Server 4.1 ( versi lebih tinggi ).

Beikut adalah cara membuat Restful Web Service :

1. Buka Netbenas IDE,  pilih File --> New Project, pilih Java Web --> Web Application

Catatan : Menggunakan layanan web Maven dengan memilih Maven > Web Application Maven

2. Isi nama project ( Contoh : HelloWorld )

3. Kemudian, pilih GlassFish Server. lalu klik Next

4. Selanjutnya  klik Finish. ( tidak menggunakan framework ), akan terbuat File index.jsp

5. Klik Kanan nama_project dan Pilih New, lalu pilih RESTFul Web Service Patterns.

6. Pilih Simple Root Resource. Klik Next.

7. Masukkan nama paket resource :  HelloWorld. Masukkan nama ‘helloworld’ di field Path. Dan masukkan HelloWorld di kolom nama class. Untuk MIME pilih text/html. lalu klik Finish.

8.  Setelah itu,  akan terbuat 2 file baru (ApplicationConfig.java dan HelloWorld.java).

9.  Pada file HelloWorld.java, cari method getHtml(). Isikan script berikut.

@GET

    @Produces("text/html")

    public String getHtml() {

        return "<title>Hello</title>"

                + "<html><body><H1>Hello World</body></h1></html> ";

    }


Kode lengkap menjadi adalah :

package id.web.service;

import javax.ws.rs.core.Context;

import javax.ws.rs.core.UriInfo;

import javax.ws.rs.Produces;

import javax.ws.rs.Consumes;

import javax.ws.rs.GET;

import javax.ws.rs.Path;

import javax.ws.rs.PUT;


/* REST Web Service  */

@Path("hello")

public class HelloWorld {

    @GET

    @Produces("text/html")

    public String getHtml() {

        return "<title>Hello</title>"

                + "<html><body><H1>Hello World</body></h1></html> ";

    }   

}

10.  Kemudian jalankan dengan klik kanan pada nama_project. Pilih Properties, lalu pilih Categories Run

Catatan :

Kemudian isikan Relative URL : rest/hello, ( secara default http://localhost:8080/HelloWorld), sistem akan menjalankan file index.jsp (Hello World !!).

Klik Kanan peoject dan pilih Deploy. Selanjutnya jika proses deploy selesai, klik kanan project dan pilih Run.

Hasil :


Saturday, December 24, 2022

Membuat Game Snake Menggunakan Java

 


Source gamesnake.java :

package com.snake;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.FontMetrics;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

import javax.swing.JPanel;

import javax.swing.Timer;

public class Board extends JPanel implements ActionListener {

    private final int B_WIDTH = 300;

    private final int B_HEIGHT = 300;

    private final int DOT_SIZE = 10;

    private final int ALL_DOTS = 900;

    private final int RAND_POS = 29;

    private final int DELAY = 140;

    private final int x[] = new int[ALL_DOTS];

    private final int y[] = new int[ALL_DOTS];

    private int dots;

    private int apple_x;

    private int apple_y;

    private boolean leftDirection = false;

    private boolean rightDirection = true;

    private boolean upDirection = false;

    private boolean downDirection = false;

    private boolean inGame = true;

    private Timer timer;

    private Image ball;

    private Image apple;

    private Image head;


    public Board() {

        initBoard();

    }

    

    private void initBoard() {

        addKeyListener(new TAdapter());

        setBackground(Color.black);

        setFocusable(true);


        setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));

        loadImages();

        initGame();

    }


    private void loadImages() {

        ImageIcon iid = new ImageIcon("src/resources/dot.png");

        ball = iid.getImage();


        ImageIcon iia = new ImageIcon("src/resources/apple.png");

        apple = iia.getImage();


        ImageIcon iih = new ImageIcon("src/resources/head.png");

        head = iih.getImage();

    }


    private void initGame() {

        dots = 3;


        for (int z = 0; z < dots; z++) {

            x[z] = 50 - z * 10;

            y[z] = 50;

        }

        

        locateApple();


        timer = new Timer(DELAY, this);

        timer.start();

    }


    @Override

    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        doDrawing(g);

    }

    

    private void doDrawing(Graphics g) {

        if (inGame) {


            g.drawImage(apple, apple_x, apple_y, this);


            for (int z = 0; z < dots; z++) {

                if (z == 0) {

                    g.drawImage(head, x[z], y[z], this);

                } else {

                    g.drawImage(ball, x[z], y[z], this);

                }

            }


            Toolkit.getDefaultToolkit().sync();


        } else {


            gameOver(g);

        }        

    }


    private void gameOver(Graphics g) {        

        String msg = "Game Over";

        Font small = new Font("Helvetica", Font.BOLD, 14);

        FontMetrics metr = getFontMetrics(small);


        g.setColor(Color.white);

        g.setFont(small);

        g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2, B_HEIGHT / 2);

    }


    private void checkApple() {

        if ((x[0] == apple_x) && (y[0] == apple_y)) {


            dots++;

            locateApple();

        }

    }


    private void move() {

        for (int z = dots; z > 0; z--) {

            x[z] = x[(z - 1)];

            y[z] = y[(z - 1)];

        }


        if (leftDirection) {

            x[0] -= DOT_SIZE;

        }


        if (rightDirection) {

            x[0] += DOT_SIZE;

        }


        if (upDirection) {

            y[0] -= DOT_SIZE;

        }


        if (downDirection) {

            y[0] += DOT_SIZE;

        }

    }


    private void checkCollision() {

        for (int z = dots; z > 0; z--) {


            if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) {

                inGame = false;

            }

        }


        if (y[0] >= B_HEIGHT) {

            inGame = false;

        }


        if (y[0] < 0) {

            inGame = false;

        }


        if (x[0] >= B_WIDTH) {

            inGame = false;

        }


        if (x[0] < 0) {

            inGame = false;

        }

        

        if (!inGame) {

            timer.stop();

        }

    }


    private void locateApple() {

        int r = (int) (Math.random() * RAND_POS);

        apple_x = ((r * DOT_SIZE));


        r = (int) (Math.random() * RAND_POS);

        apple_y = ((r * DOT_SIZE));

    }


    @Override

    public void actionPerformed(ActionEvent e) {

        if (inGame) {


            checkApple();

            checkCollision();

            move();

        }


        repaint();

    }


    private class TAdapter extends KeyAdapter {

        @Override

        public void keyPressed(KeyEvent e) {


            int key = e.getKeyCode();


            if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) {

                leftDirection = true;

                upDirection = false;

                downDirection = false;

            }


            if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) {

                rightDirection = true;

                upDirection = false;

                downDirection = false;

            }


            if ((key == KeyEvent.VK_UP) && (!downDirection)) {

                upDirection = true;

                rightDirection = false;

                leftDirection = false;

            }


            if ((key == KeyEvent.VK_DOWN) && (!upDirection)) {

                downDirection = true;

                rightDirection = false;

                leftDirection = false;

            }

        }

    }

}


Hasil :


Saturday, December 10, 2022

Zkoss Framework Pivottable

 


Source :

1. File Zul :

<?page title="ZK Pivottable: Airline Agency Sales" ?>
<zk>
    <window apply="demo.app.pivottable.PivotDemoBaseController" hflex="max">
        <hlayout id="preDef" spacing="5px" sclass="z-valign-middle">Predefined scenario :</hlayout>
        <separator height="20px" />
        <pivottable id="pivot" hflex="max">
            <div></div>
            <div>Columns</div>
            <div>Rows</div>
        </pivottable>
        <separator height="20px" />
        <groupbox closable="false" mold="3d">
            <caption label="Field Control" />
            <vlayout style="padding: 10px">
                <pivot-field-control id="pfc" height="300px" />
                <separator />
                <hlayout spacing="10px" sclass="z-valign-middle">
                    Data field orientation :
                    <radiogroup id="dataOrient">
                        <vlayout>
                            <radio id="colOrient" label="column" />
                            <radio id="rowOrient" label="row" />
                        </vlayout>
                    </radiogroup>
                    <checkbox id="colGrandTotal" label="Enable grand total for columns" />
                    <checkbox id="rowGrandTotal" label="Enable grand total for rows" />
                    <checkbox id="autowrap" label="Enable Autowrap" />
                </hlayout>
            </vlayout>
        </groupbox>
    </window>
</zk>


2. Controller :

2.1. pivotbasecontroller.java

package demo.app.pivottable;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
import org.zkoss.pivot.Pivottable;
import org.zkoss.pivot.impl.TabularPivotModel;
import org.zkoss.pivot.ui.PivotFieldControl;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.CheckEvent;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Hlayout;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Vlayout;
 
public class PivotDemoBaseController extends SelectorComposer<Component> {
 
    private static final long serialVersionUID = 1L;
    @Wire
    private Pivottable pivot;
    @Wire
    private PivotFieldControl pfc;
    @Wire
    private Checkbox colGrandTotal, rowGrandTotal;
    @Wire
    private Radio colOrient, rowOrient;
    @Wire
    private Vlayout rawDataLayout;
    @Wire
    private Hlayout preDef;
 
    private TabularPivotModel pivotModel;
 
    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
 
        StaticPivotModelFactory pmf = StaticPivotModelFactory.INSTANCE;
        pivotModel = pmf.build();
        pivot.setModel(pivotModel);
        pfc.setModel(pivotModel);
        loadConfiguration(pmf.getDefaultConfigurator());
 
        // load predefined scenario
        for (PivotConfigurator conf : pmf.getConfigurators())
            preDef.appendChild(getPreDefDiv(conf));
    }
 
    @Listen("onCheck = #colGrandTotal")
    public void enableColumnGrandTotal(CheckEvent event) {
        pivot.setGrandTotalForColumns(event.isChecked());
    }
 
    @Listen("onCheck = #rowGrandTotal")
    public void enableRowGrandTotal(CheckEvent event) {
        pivot.setGrandTotalForRows(event.isChecked());
    }
 
    @Listen("onCheck = #dataOrient")
    public void enableDataOrient(CheckEvent event) {
        pivot.setDataFieldOrient(((Radio) event.getTarget()).getLabel());
    }
 
    @Listen("onCheck = #autowrap")
    public void enableAutowrap(CheckEvent event) {
        pivot.setAutowrap(event.isChecked());
    }
     
    private void initControls() {
        // grand totals
        colGrandTotal.setChecked(pivot.isGrandTotalForColumns());
        rowGrandTotal.setChecked(pivot.isGrandTotalForRows());
 
        // data orientation
        ("column".equals(pivot.getDataFieldOrient()) ? colOrient : rowOrient).setChecked(true);
 
        pfc.syncModel(); // field control
    }
 
    private String renderRawData(Object object, String fname) {
        if ("Agent".equals(fname) || "Customer".equals(fname)) {
            String[] names = ((String) object).split(" ", 2);
            return Character.toUpperCase(names[0].charAt(0)) + ". " + names[1];
        } else if ("Date".equals(fname)) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
            return format.format((Date) object);
        }
        return object == null ? "(null)" : object.toString();
    }
 
    private Component getPreDefDiv(final PivotConfigurator conf) {
        Button scenarioBtn = new Button(conf.getTitle());
        scenarioBtn.setSclass("predef");
        scenarioBtn.addEventListener("onClick", new EventListener<Event>() {
            public void onEvent(Event event) throws Exception {
                loadConfiguration(conf);
            }
        });
        return scenarioBtn;
    }
 
    private void loadConfiguration(PivotConfigurator conf) {
        pivotModel.clearAllFields(true);
        conf.configure(pivotModel);
        conf.configure(pivot);
        pivot.setPivotRenderer(conf.getRenderer());
        initControls();
    }
 
}


2.2. pivotconfigurator.java

package demo.app.pivottable;
 
import org.zkoss.pivot.PivotRenderer;
import org.zkoss.pivot.Pivottable;
import org.zkoss.pivot.impl.TabularPivotModel;
 
public abstract class PivotConfigurator {
 
    private final String title;
 
    public PivotConfigurator(String title) {
        this.title = title;
    }
 
    public String getTitle() {
        return title;
    }
     
    public abstract void configure(TabularPivotModel model);
 
    public abstract void configure(Pivottable table);
 
    public abstract PivotRenderer getRenderer();
}


2.3. staticpivotmodelfactory.java

package demo.app.pivottable;
 
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
 
import org.zkoss.pivot.GroupHandler;
import org.zkoss.pivot.PivotField;
import org.zkoss.pivot.PivotHeaderContext;
import org.zkoss.pivot.PivotRenderer;
import org.zkoss.pivot.Pivottable;
import org.zkoss.pivot.impl.SimplePivotRenderer;
import org.zkoss.pivot.impl.StandardCalculator;
import org.zkoss.pivot.impl.TabularPivotModel;
 
public class StaticPivotModelFactory {
 
 
    public static final StaticPivotModelFactory INSTANCE = new StaticPivotModelFactory();
 
    private StaticPivotModelFactory() {
    }
 
    public TabularPivotModel build() {
        return new TabularPivotModel(PivotData.getData(), PivotData.getColumns());
    }
 
    // configurator //
 
    public PivotConfigurator getDefaultConfigurator() {
        return CONFIG_CITY_SALES;
    }
 
    public PivotConfigurator[] getConfigurators() {
        return new PivotConfigurator[] { CONFIG_PERFORMANCE, CONFIG_CITY_SALES, CONFIG_SALES_RACE };
    }
 
    public static final PivotConfigurator CONFIG_PERFORMANCE = new PivotConfigurator("Performance") {
        public void configure(TabularPivotModel model) {
            model.setFieldType("Airline", PivotField.Type.COLUMN);
            model.setFieldType("Flight", PivotField.Type.COLUMN);
            model.setFieldType("Agent", PivotField.Type.ROW);
            model.setFieldType("Customer", PivotField.Type.ROW);
            model.setFieldType("Price", PivotField.Type.DATA);
            model.setFieldType("Mileage", PivotField.Type.DATA);
 
            model.setFieldSubtotals("Airline", new StandardCalculator[] {
                    StandardCalculator.AVERAGE, StandardCalculator.COUNT
            });
            model.setFieldSubtotals("Agent", new StandardCalculator[] {
                    StandardCalculator.AVERAGE, StandardCalculator.COUNT
            });
        }
 
        public void configure(Pivottable table) {
            table.setDataFieldOrient("column");
        }
         
        public PivotRenderer getRenderer() {
            return null;//use default
        }
    };
 
    public static final PivotConfigurator CONFIG_CITY_SALES = new PivotConfigurator("Sales by City") {
        public void configure(TabularPivotModel model) {
            model.setFieldType("Origin", PivotField.Type.COLUMN);
            model.setFieldType("Destination", PivotField.Type.COLUMN);
            model.setFieldType("Airline", PivotField.Type.ROW);
            model.setFieldType("Flight", PivotField.Type.ROW);
            model.setFieldType("Customer", PivotField.Type.DATA);
            model.setFieldType("Price", PivotField.Type.DATA);
        }
 
        public void configure(Pivottable table) {
            table.setDataFieldOrient("row");
        }
         
        public PivotRenderer getRenderer() {
            return null;//use default
        }
    };
 
    public static final PivotConfigurator CONFIG_SALES_RACE = new PivotConfigurator("Sales Race!") {
        public void configure(TabularPivotModel model) {
            model.setFieldType("Agent", PivotField.Type.COLUMN);
            model.setFieldType("Date", PivotField.Type.ROW);
            model.setFieldType("Customer", PivotField.Type.DATA);
            model.setFieldType("Price", PivotField.Type.DATA);
 
            // sort by last name, then first name
            model.setFieldKeyComparator("Agent", new Comparator<Object>() {
                public int compare(Object k1, Object k2) {
                    String s1 = (String) k1;
                    String s2 = (String) k2;
                    int i1 = s1.lastIndexOf(' ');
                    int i2 = s2.lastIndexOf(' ');
                    int cmp = s1.substring(i1 + 1).compareTo(s2.substring(i2 + 1));
                    if (cmp != 0)
                        return cmp;
                    String fname1 = i1 < 0 ? "" : s1.substring(0, i1).trim();
                    String fname2 = i2 < 0 ? "" : s2.substring(0, i2).trim();
                    return fname1.compareTo(fname2);
                }
            });
 
            // sort date by descending order
            model.getField("Date").setGroupHandler(new GroupHandler() {
                public Object getGroup(Object data) {
                    SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
                    return format.format((Date) data);
                }
            });
            model.setFieldKeyOrder("Date", false);
        }
 
        public void configure(Pivottable table) {
            table.setDataFieldOrient("column");
        }
 
        public PivotRenderer getRenderer() {
            return SALES_RACE_RENDERER;
        }
    };
 
    private static final PivotRenderer SALES_RACE_RENDERER = new SimplePivotRenderer() {
 
        public int getColumnSize(Pivottable table, PivotHeaderContext colc, PivotField dataField) {
            if (dataField != null && "Price".equals(dataField.getFieldName()))
                return 200;
            return colc.isGrandTotal() && dataField != null ? 150 : 100;
        }
 
        public String renderCellSClass(Number data, Pivottable table, PivotHeaderContext rowContext,
                PivotHeaderContext columnContext, PivotField dataField) {
            if (dataField != null && "Price".equals(dataField.getFieldName())) {
                String sclass = "highlight";
                if (!rowContext.isGrandTotal() && !columnContext.isGrandTotal() && data != null
                        && data.doubleValue() > 300)
                    sclass += " important";
                return sclass;
            }
            return null;
        }
 
        public String renderCellStyle(Number data, Pivottable table, PivotHeaderContext rowContext,
                PivotHeaderContext columnContext, PivotField dataField) {
            if (columnContext.isGrandTotal())
                return "color: #11EE11; font-weight: bold";
            return null;
        }
    };
 
}


3. Model :




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...