Membuat Pagination untuk JTable dan Java Persistence API 2


Peralatan yang diperlukan untuk tutorial ini :

  1. Java Development Kit 1.6
  2. NetBeans IDE 6.8
  3. EclipseLink 2 (Terbundle dalam NetBeans IDE 6.8)
  4. MySQL Database Server

Jika seluruh peralatan terlah tersedia, berarti Anda dapat mengikuti tutorial ini ๐Ÿ˜€

Membuat Project Java Application

JTable merupakan komponen antar muka tabel / grid yang terdapat pada Java Swing. Untuk membuat aplikasi berbasis antar muka, kita harus membuat project jenis java application pada netbeans, caranya : File -> New Project, setelah itu pada bagian Categories pilih Java dan pada bagian Types pilih Java Application :

Memuat Persistence Unit

Agar proyek yang Anda buat mendukung fitur Java Persistence API, maka Anda harus membuat Persistence Unit. Untuk membuat persistence unit, caranya lewat menu File -> New File, lalu pada bagian Categories pilih Persistence dan pada bagian Types pilih Persistence Unit. Setelah itu klik Next :

Jangan lupa untuk membuat database jika memang database untuk proyek ini belum ada, sehingga pada combo box Database Connection tinggal buat koneksi baru :

Membuat Entity

Dalam sebuah proyek yang menggunakan JPA, tidak ada yang namanya Tabel. seluruh Tabel harus ditransformasikan menjadi Entitas, atau disebut Entity. Misal pada proyek ini kita buat entitas yang sederhana, yaitu entitas data, yang hanya menamping ID dan DATA. Untuk membaut entitas, caranya lewat menu File -> New File, setelah itu pada bagian Categories pilih Persistence, dan pada bagian Types pilih Entity Class. Setelah itu klik Next :

Isi dari entitas Data adalah seperti dibawah ini :

package khannedy.pagination.helper;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 *
 * @author echo
 */
@Entity
@Table(name = "datas")
public class Data implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String data;

    public Long getId() {
	return id;
    }

    public void setId(Long id) {
	this.id = id;
    }

    public String getData() {
	return data;
    }

    public void setData(String data) {
	this.data = data;
    }

    @Override
    public int hashCode() {
	int hash = 0;
	hash += (id != null ? id.hashCode() : 0);
	return hash;
    }

    @Override
    public boolean equals(Object object) {
	// TODO: Warning - this method won't work in the case the id fields are not set
	if (!(object instanceof Data)) {
	    return false;
	}
	Data other = (Data) object;
	if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
	    return false;
	}
	return true;
    }

    @Override
    public String toString() {
	return "khannedy.pagination.helper.Data[id=" + id + "]";
    }
}

Membuat TableModel

Dikarenakan kita menggunakan JTable, jadi harus membuat TableModel. TableModel ini digunakan untuk menampung data pada JTable yang memuat data-data enitas Data. Isinya seperti ini :

package khannedy.pagination.helper;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author echo
 */
public class TableModelData extends AbstractTableModel {

    private static final long serialVersionUID = 1L;

    private List datas = new ArrayList();

    public void setData(Collection collection) {
	datas.clear();
	datas.addAll(collection);
	fireTableDataChanged();
    }

    public int getRowCount() {
	return datas.size();
    }

    public int getColumnCount() {
	return 2;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
	switch (columnIndex) {
	    case 0:
		return datas.get(rowIndex).getId();
	    case 1:
		return datas.get(rowIndex).getData();
	    default:
		return null;
	}
    }

    @Override
    public String getColumnName(int column) {
	switch (column) {
	    case 0:
		return "Id";
	    case 1:
		return "Data";
	    default:
		return null;
	}
    }
}

Membuat Form

Setelah itu buat Form untuk tampilan antar muka aplikasinya. Untuk membuat Form dalam NetBeans caranya lewat menu File -> New File, setelah itu pada bagian Categories pilih Swing GUI Form dan pada bagian Types pilih JFrame Form. Setelah itu beri nama Form nya, misal Form :

Misal saya membuat tampilan form seperti pada gambar dibawah ini :

Untuk nama-nama komponennya anda bisa melihatnya pada gambar dibawah ini :

Membuat Pagination

Setelah selesai membuat Form, saatnya membuat Pagination. Ini merupakan utilitas yang dapat kita gunakan untuk mempermudah penghalamanan tabel yang akan digunakan. Caranya buat sebuah class java bernama Pagination, isinya seperti pada kode dibawah ini :

package khannedy.pagination.helper;

/**
 *
 * @author echo
 */
public class Pagination {

    private int pageSize;

    private int totalItem;

    private int currentPage;

    public Pagination(int pageSize, int totalItem) {
	this.pageSize = pageSize;
	this.totalItem = totalItem;
    }

    public int getPageSize() {
	return pageSize;
    }

    public int getTotalItem() {
	return totalItem;
    }

    public int getTotalPage() {
	return (totalItem / pageSize) - 1;
    }

    public int getCurrentPage() {
	return currentPage;
    }

    public int getCurrentItem() {
	return currentPage * pageSize;
    }

    public void nextPage() {
	currentPage++;
    }

    public void prevPage() {
	currentPage--;
    }

    public void firstPage() {
	currentPage = 0;
    }

    public void lastPage() {
	currentPage = getTotalPage();
    }

    public boolean isHasNextPage() {
	return currentPage < getTotalPage();
    }

    public boolean isHasPrevPage() {
	return currentPage != 0;
    }
}

Membuat PersistenceHelper

Setelah membuat pagination, sekarang saatnya membuat PersistenceHelper, kelas ini berisikan utilitas yang digunakan untuk mendapatkan EntityManagerFactory-nya JPA 2. Kelas ini bisa juga disebut kelas Database Creator ๐Ÿ˜€

package khannedy.pagination.helper;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author echo
 */
public class PersistenceHelper {

    private static final EntityManagerFactory factory;

    static {
	factory = Persistence.createEntityManagerFactory("paginationPU");
    }

    public static EntityManagerFactory getFactory() {
	return factory;
    }
}

Menambahkan Pagination ke Form

Setelah membuat kelas Pagination saatnya membuat Form yang mendukung fotur Pagination. Pertama sebelum menambah fitur pagination, kita harus menambahkan TableModel terlebih dahulu ke JTablenya, sehingga isi konstruktur Form nya seperti bawah ini :

public class Form extends javax.swing.JFrame {

    private static final long serialVersionUID = 1L;

    private TableModelData tableModel;

    /** Creates new form Form */
    public Form() {
        initComponents();

	tableModel = new TableModelData();
	tableData.setModel(tableModel);
    }

Setelah menambahkan TableModel, saatnya meload data dari Persistence ke TableModel, namun syaratnya harus menggunakan pagination, jadi kodenya seperti dibawah ini :

public class Form extends javax.swing.JFrame {

    private static final long serialVersionUID = 1L;

    private TableModelData tableModel;

    private Pagination pagination;

    /** Creates new form Form */
    public Form() {
	initComponents();

	tableModel = new TableModelData();
	tableData.setModel(tableModel);

	// deklarasikan Pagination
	initPagination();

	// refresh data
	refresh();
    }

    public void initPagination() {
	EntityManager manager = PersistenceHelper.getFactory().createEntityManager();
	try {
	    CriteriaBuilder builder = manager.getCriteriaBuilder();
	    CriteriaQuery query = builder.createQuery(Long.class);

	    Root data = query.from(Data.class);
	    query.select(builder.count(data));

	    int count = manager.createQuery(query).getSingleResult().intValue();

	    pagination = new Pagination(100, count);

	} finally {
	    manager.close();
	}
    }

    public void refresh() {
	EntityManager manager = PersistenceHelper.getFactory().createEntityManager();
	try {
	    CriteriaBuilder builder = manager.getCriteriaBuilder();
	    CriteriaQuery query = builder.createQuery(Data.class);

	    Root data = query.from(Data.class);
	    query.select(data);

	    List list = manager.createQuery(query).
		    setFirstResult(pagination.getCurrentItem()).
		    setMaxResults(pagination.getPageSize()).getResultList();

	    tableModel.setData(list);

	    buttonNext.setEnabled(pagination.isHasNextPage());
	    buttonPrev.setEnabled(pagination.isHasPrevPage());

	} finally {
	    manager.close();
	}
    }

Setelah itu tambahkan aksi tombolFirst, caranya klik kanan tombolnya lalu pilih Events -> Action -> actionPerformed :

    private void buttonFirstActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	pagination.firstPage();
	refresh();
    }

Untuk aksi buttonPrev :

    private void buttonPrevActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	pagination.prevPage();
	refresh();
    }

Untuk aksi buttonNext :

    private void buttonNextActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	pagination.nextPage();
	refresh();
    }

Untuk aksi buttonLast :

    private void buttonLastActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	pagination.lastPage();
	refresh();
    }

Dan jika selesai ๐Ÿ˜€

jika dijalankan….

wew kok error ๐Ÿ˜ฆ

run:
[EL Info]: 2010-04-09 00:30:07.939--ServerSession(1680250)--EclipseLink, version: Eclipse Persistence Services - 2.0.1.v20100213-r6600
[EL Severe]: 2010-04-09 00:30:07.964--ServerSession(1680250)--Local Exception Stack:
Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:397)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
        at khannedy.pagination.helper.Form.initPagination(Form.java:43)
        at khannedy.pagination.helper.Form.(Form.java:39)
        at khannedy.pagination.helper.Form$5.run(Form.java:200)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
        ... 14 more
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
        at khannedy.pagination.helper.Form.initPagination(Form.java:43)
        at khannedy.pagination.helper.Form.(Form.java:39)
        at khannedy.pagination.helper.Form$5.run(Form.java:200)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

BUILD STOPPED (total time: 17 seconds)

Tenang, tenang ๐Ÿ˜€ Itu cuma Driver MySQL nya belum dimasukkan ke Project. TInggal dimasukkan aja ke project… ๐Ÿ˜€ Dan sekarang :

Hmm…. Lumayan..

Dah malam ah, dah ngantuk, tar gak bisa bangun subuh lagi ๐Ÿ˜€

See You!!!

Download Source Code

Silahkan download sourcecode tutorial ini –> disini <–

Iklan

14 pemikiran pada “Membuat Pagination untuk JTable dan Java Persistence API 2

  1. Mas Eko, waktu saya cobain, kenapa Error ya pada Form.java nya??

    Errornya :

    cannot find symbol method getCriteriaBuilder()

    itu terdapat pada pada method public void initPaginatio()

    dan public void refresh()

    itu kenapa ya??

    Makasih sebelumnya..

  2. Mas Eko, kenapa waktu mau buat database connection setelah saya buat yang baru malah muncul error ya?

    “unable to add connection. cannot establish to jdbc:mysql:// bla bla bla”

    mohon pencerahannya.

  3. Boleh dong request tutor java pakai JPA tapi JTable nya ada 2 buah dan saling berhubungan satu dan lainnya , bisa di insert , update , delete data nya . hehehe kalau bisa sih.

  4. mas boleh minta tips2 untuk lebih praktis ga..? seperti kalo entity manager sebenarnya bisa langsung dibikinin netBeans dengan drag drop tabelnya aja khan.. nah, kalo blh, saya minta tips2 yang mempermudah, ga harus ngoding sebanyak itu heheh ^^ tapi selain yg bikin entity manager tadi.. makasih banyak mas!

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s