Pengenalan Swing Framework dan Beans Binding bag.2

Akhirnya tulisan ini bisa dilanjutin lagi.. sory karena baru ada waktu lowong. Pada tulisan sebelumnya kita sudah sampai pada pembuatan class-class DAO yang dibutuhkan aplikasi. Nah sekarang kita buatkan user interfacenya.

Buatlah sebuah class baru dalam hal ini JDialog Form beri nama ProductDialog dengan package productsrecord, dan desainlah tampilannya seperti gambar berikut.

Perhatikan dalam form(JDialog) kita menggunakan tabpane untuk Daftar Kategori dan Daftar Barang. Pada gambar di atas adalah tampilan tab untuk Daftar Kategori dan Gambar berikut adalah tampilan untuk tab daftar barang.

form2

Berilah nama masing-masing component swing tersebut sesusai keinginan anda. Misalnya tabel untuk Category saya beri nama categoryTable dan tabel untuk product saya beri nama productTable. Demikian juga untuk textfield-textfield yang ada. Kecuali untuk tombol nanti kita beri nama kemudian.

Baik selanjutnya kita akan membuat sebuah class tambahan/pembantu yang berfungsi sebagai perantara antara user interface dengan class-class DAO sebelumnya. Buatlah sebua class dengan nama Service dan simpan dengan package productsrecord. Berikut isi dari class Service tersebut:


public class Service {
private EntityManager em;
private ProductDAO pDao;
private CategoryDAO cDao;
public Service(EntityManager em){
setEm(em);
}
private void setEm(EntityManager em) {
this.em = em;
this.pDao = new ProductDAO(this.em);
this.cDao = new CategoryDAO(this.em);
}
public void refresh(Object ebj){
this.em.getTransaction().begin();
this.em.refresh(ebj);
this.em.getTransaction().commit();
}
public void save(Product product){
this.em.getTransaction().begin();
pDao.save(product);
this.em.getTransaction().commit();
}
public void save(Category cat){
this.em.getTransaction().begin();
cDao.save(cat);
this.em.getTransaction().commit();
}
public void delete(Product product){
this.em.getTransaction().begin();
pDao.delete(product);
this.em.getTransaction().commit();
}
public void delete(Category cat){
this.em.getTransaction().begin();
cDao.delete(cat);
this.em.getTransaction().commit();
}
public Product getProduct(long id){
return pDao.getProduct(id);
}
public Category getCategory(long id){
return cDao.getCategory(id);
}
public List<Product> getProducts(){
return pDao.getProducts();
}
public List<Category> getCategories(){
return cDao.getCategories();
}
}

Selanjutnya bukalah class ProductRecordApp dan tambahkan 2 property berikut ini


public class ProdukApp extends SingleFrameApplication {

private static Service service;
private static EntityManager em;

//..... code yang lain

}

Kemudian masih di class ProductRecordApp, ubahlah method startup menjadi


@Override protected void startup() {
em = Persistence.createEntityManagerFactory("ProductsRecordPU").createEntityManager();
service = new Service(em);
show(new ProdukView(this));
}

Berikutnya buatkan method seter untuk menakses property service tersebut


public static Service getService() {
return service;
}

Ok selanjutnya kita akan melakukan binding data ke form yang sudah kita buat sebelumnya. Buatlah QueryResult seperti gambar dibawah ini

list1maka akan tercipta list1 pada bagian Other Components. Klik kanan pada list1 dan pilih Properties, maka akan ditampilkan window properties untuk list1. Selanjutnya lakukan langkah-langkah berikut:

Aktifkan centangan pada observable

Pindah ke tab Code, dan ubah Variable Name menjadi categoryList dan Type Parametersnya menjadi <Category>

Masih di tab Code, pada Custome Creation Code tambahkan code berikut


ObservableCollections.observableList(ProductRecordApp.getService().getCategories())

Dan pada Pre-Creation Code tambahkan code berikut


categoryList = new ArrayList&amp;amp;amp;amp;amp;amp;amp;amp;lt;Category&amp;amp;amp;amp;amp;amp;amp;amp;gt;();

Selanjutnya kita akan mem-bind tabel Category ke categoryList yang baru dibuat. Pada form Klik kanan categoryTable dan pilih Bind>elements

bind1Selanjutnya akan ditampilkan Bind Properties Window. Lakukan perubahan sesuai yang ditampilkan pada gambar berikut, kemudian tekan tombol OK

bindprop1

Selanjutnya kita akan melakukan binding juga untuk textfield Nama dan Keterangan pada Category. Klik kanan pada textfield Nama dan pilih Bind>text. Maka akan ditampilkan bind properties window. Lakukan perubahan seperti pada gambar berikut:

bindtxtnama

Lakukan hal yang sama untuk textfield Keterangan. Yang berbeda hanyalah binding Expressionnya menjadi ${selectedElement.description}

Pindah pada mode Source dan tambahkan method berikut ini


public class ProductDialog extends javax.swing.JDialog {

//code program lainnya

private boolean isNew;
private boolean isNewProduct;
private void updateCategories(){
List&amp;amp;amp;amp;amp;amp;lt;Category&amp;amp;amp;amp;amp;amp;gt; data = ProductsRecordApp.getService().getCategories();
for (Object object : data) {
ProductsRecordApp.getService().refresh(object);
}
categoryList.clear();
categoryList.addAll(data);
}

//code program lainnya

Selanjutnya kembali lagi ke mode Design dan klik kanan pada jButton1 kemudian pilih Set Action.. maka akan ditampilkan Window Set Action dan lakukan perubahan sesuai dengan gambar berikut.

binddelete1

Setelah kita menekan tombol OK maka secara otomatis Netbeans akan menciptakan sebuah action method sesuai dengan nama yang kita berikan. Ubahlah method deleteCategory sesuai kode berikut ini

&amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;gt;

&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;@Action
public void deleteCategory() {
if(!isNew){
int[] selected = categoryTable.getSelectedRows();
List&amp;amp;amp;amp;amp;amp;lt;Category&amp;amp;amp;amp;amp;amp;gt; toRemove = new ArrayList&amp;amp;amp;amp;amp;amp;lt;Category&amp;amp;amp;amp;amp;amp;gt;(selected.length);
for (int x = 0; x &amp;amp;amp;amp;amp;amp;lt; selected.length; x++) {
Category cat = categoryList.get(categoryTable.convertRowIndexToModel(selected[x]));
toRemove.add(cat);
ProductsRecordApp.getService().delete(cat);
}
categoryList.removeAll(toRemove);
}else{
Category cat = categoryList.get(categoryTable.convertRowIndexToModel(categoryList.size()-1));
categoryList.remove(cat);
ProductsRecordApp.getService().delete(cat);
}
categoryTable.getSelectionModel().clearSelection();
txtCategoryName.setText("");
txtCategoryDesc.setText("");
refreshCategoryButton.setEnabled(true);
insertCategoryButton.setEnabled(true);
isNew = false;
}
&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;

Selanjutnya ganti nama masing-masing jButton1 menjadi deleteCategoryButton, dan jButton2 menjadi saveCategoryButton, jButton3 menjadi  insertCategoryButton dan jButton4 menjadi refreshCategoryButton.

Selanjutnya kita tambahkan action untuk saveCategoryButton. Klik kanan pada saveCategoryButton, pilih Set Action dan sesuaikan seperti gambar berikut.

bindsave1

Kemudian ubahlah method saveCategory seperti berikut ini

&amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;gt;

&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;@Action
public void saveCategory() {
Integer selectedRow = categoryTable.getSelectedRow();
if (selectedRow &amp;amp;amp;amp;amp;amp;gt;= 0) {
Category cat = categoryList.get(selectedRow);
cat.setName(txtCategoryName.getText());
cat.setDescription(txtCategoryDesc.getText());
ProductsRecordApp.getService().save(cat);
updateCategories();
categoryTable.getSelectionModel().clearSelection();
txtCategoryName.setText("");
txtCategoryDesc.setText("");
if(isNew){
if(JOptionPane.showConfirmDialog(this, "Data Tersimpan\nTambah data lagi?","Konfirmation",JOptionPane.YES_NO_OPTION)==0){
insertCategory();
}else{
isNew = false;
refreshCategoryButton.setEnabled(true);
insertCategoryButton.setEnabled(true);
}
}
}
}
&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;

Berikutnya kita tambakan Action untuk tombol insertCategoryButton. Klik kanan pada tombol insertCategoryButton, pilih Set Action.. dan ubahlah propertinya seperti pada gambar berikut

bindinsert1

Kemudian ubahlah method insertCategory menjadi seperti berikut

&amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;gt;

&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;@Action
public void insertCategory() {
isNew = true;
Category newCategory = new Category();
newCategory.setName("");
newCategory.setDescription("");
ProductsRecordApp.getService().save(newCategory);
updateCategories();
int selectedRow = categoryList.size()-1;
categoryTable.getSelectionModel().setSelectionInterval(selectedRow, selectedRow);
refreshCategoryButton.setEnabled(false);
insertCategoryButton.setEnabled(false);
txtCategoryName.requestFocus();
}
&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;

Dan yang berikutnya kita akan menambahkan Action untuk tombol refreshCategoryButton. Klik kanan pada tombol tersebut, pilih Set Action dan ubahlah sesuai gambar berikut

bindrefresh1

Selanjutnya ubahlah method refreshCategory menjadi sebagai berikut

&amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;gt;

&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;@Action
public void refreshCategory() {
updateCategories();
categoryTable.getSelectionModel().clearSelection();
txtCategoryName.setText("");
txtCategoryDesc.setText("");
}
&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;

Ok sampai disini kita sudah menyelesaikan semua fungsi untuk Category. Agar bisa dijalankan, kita harus membuat menu pada frame utama yang akan memanggil frame ProductDialog. Bukalah class ProductRecordView. Pada mode design, tambahkan menu untuk File seperti pada gambar berikut

addmenu

Ubahlah text untuk menu tersebut menjadi Products kemudian klik kanan pada menu Products tersebut dan pilih Set Action.. dan ubahlah sesuai gambar berikut ini

menuaction

Ubahlah method showProductsDialog menjadi sebagai berikut

&amp;amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;amp;gt;

&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;private JDialog productDialog;
@Action
public void showProductsDialog() {
if (productDialog == null) {
JFrame mainFrame = ProductsRecordApp.getApplication().getMainFrame();
productDialog = new ProductDialog(mainFrame, false);
productDialog.setLocationRelativeTo(mainFrame);
}
ProductsRecordApp.getApplication().show(productDialog);
}
&amp;amp;amp;amp;amp;lt;p style="text-align: left;"&amp;amp;amp;amp;amp;gt;

Ok sekarang aplikasi bisa dicoba untuk dijalankan. Silahkan dicoba untuk tambah, ubah dan hapus Category. Untuk bagian product saya lanjutkan pada tulisan berikutnya.. [to be continue]

NB: Untuk source codenya bisa dichecout dari  https:////hendrosteven.googlecode.com/svn/trunk/ProductRecord

7 comments November 30, 2008

Contoh Aplikasi Swing dengan Hibernate

Ini adalah contoh aplikasi Swing yang menggunakan Hibernate sebagai persistece frameworknya. Sebenarnya aplikasi ini udah lama dibuat tapi baru ketemua tadi jadi langsung aja di Post diblog siapa tau ada manfaatnya bagi pembaca sekalian.

Aplikasinya bernama jAdwal, sesuai namanya aplikasi ini berfungsi seperti organizer atau tempat mencatat kegiatan kita sehari-hari. Databasenya menggunakan mysql tapi tentunya bisa disesuaikan untuk database yang lain. Pada aplikasi ini juga menggunakan komponen untuk datepicker dari SwingX. Berikut beberapa screenshot dari aplikasi tersebut

newj1

Gambar di atas menunjukan bagaimana saat kita menambahkan sebuah jadwal baru.  Biar bisa dicoba sendiri silahkan download source codenya (Netbeans Project) di SINI atau bisa juga checkout dengan subversion di https://hendrosteven.googlecode.com/svn/trunk/jAdwal

21 comments November 27, 2008

Java Meet Up November 2008

Java Meet Up bulan November akan dilaksanakan di UPN Veteran Yogyakarta.

Hari : Sabtu, 29 November 2008
Waktu : 09.00 s/d Selesai
Tempat :  Ruang Seminar FISIP Lantai 3 Kampus 2 Babarsari
Kontribursi : Free (Gratis)

Materi dan pembicara :

  1. JDBC oleh Yudianto Sujana dari STMIK Pelita Nusantara Jogja.
  2. Hibernate ORM oleh Iesa Maliek dari UPN ‘V’ YK
  3. Java Persistent API oleh Hendro Steven dari UKSW Salatiga
  4. Open Source University Meetup (OSUM) oleh Alex Budiyanto dari
    SUN Microsystem Indonesia

Acara ini gratis dan ruangannya cukup untuk menampung banyak peserta. Jadi jika berminat silahkan datang.

Add comment November 24, 2008

Pengenalan Swing Framework dan Beans Binding di Netbeans IDE

Hallo pembaca setia sekalian.. pada kesempatan ini saya ingin menulis tentang Swing Framework dan Beans Binding dan tentunya bagaimana menggunakannya dengan IDE kesayangan saya Netbeans. Sebelum kita coba buat aplikasi sederhana dengan Swing Framework+Beans Binding mungkin pembaca perlu mengetahui apa itu Swing Framework dan Bean Binding.

Menurut yang saya baca dari websitenya hehehe.. Swing Framework adalah sekumpulan class yang dapat kita gunakan untuk mempermudah pengembangan aplikasi desktop berbasis swing. Dalam Swing Framework sudah disediakan class-class atau infrastruktur yang umumnya dibutuhkan oleh sebuah aplikasi desktop antara lain :

  • Application lifecyle, notably GUI startup and shutdown.
  • Support for managing and loading resources, like strings, formatted messages, images, colors, fonts, and other types common to desktop applications.
  • Support for defining, managing, and binding Actions, including Actions that run asynchronously (in the “background”).
  • Persistent session state: support for automatically and selectively saving GUI state from one run of an application to the next.

Biar lebih jelas silahkan kunjungi websitenya di https://appframework.dev.java.net/

Nah sedangkan Beans Binding adalah framework yang memudahkan kita untuk melakukan sinkronisasi antara 2 object. Yang paling umum adalah bagaimana mengsinkronisasi data pada database dengan yang ditampilkan pada user atau sinkronisasi antara komponen-komponen swing (table, textfield, combobox, checkbox, ….) Jadi jika terjadi perubahan data pada tampilan (GUI) maka otomatis data di database juga ikut berubah begitu juga sebaliknya. Untuk lebih jelasnya silahkan dibaca di https://beansbinding.dev.java.net/

Sudah cukup teorinya hehehe.. sekarang bagaimana kita coba buat aplikasinya :) Pada tulisan saya kali ini kasusnya adalah kita akan membuat aplikasi “Daftar Barang” dimana masing masing barang akan memiliki Kategori terntentu. Kalo digambarkan dalam UML kurang lebih seperti gambar berikut ini :

Saya menggunakan database MySQL tapi tentunya pembaca beleh menggunakan database yang lain yang penting sesuaikan JDBC connectornya. Pertama siapkan sebuah database dengan nama “products” dan selanjutnya ikuti langkah-langkah berikut ini:

Jalankan Netbeans (Saya menggunakan NB 6.1) kemudian buatlah sebuah project dengan nama “ProductRecord”

Pastikan jenis project yang terpilih adalah Java Destop Aplication kemudian Next. Pada layar wizard berikutnya pastikan Application Shell yang dipilih adalah Basic Application seperti gambar berikut ini, kemudian tekan tombol Finish

Netbeans secara otomatis akan membuatkan template project buat kita dan juga 3 buah Class yang akan kita gunakan.

Selanjutnya buatlah Pesistence Unit dengan klik kanan pada source package>New>Persistence Units.. Pilihlah database product yang baru kita buat sebagai Database Connectionnya kemudian Finish.

Selanjutnya buatlah 2 Entity Class yaitu Prouduct dan Category. Klik kanan pada Source Package>New>Entity Class. Beri package “model” untuk masing-masing Entity Class tersebut.


package model;

import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;

/**
*
* @author hendro
*/
@Entity
public class Product implements Serializable {
@Transient
private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="name",length=100)
private String name;
@Column(name="description",length=200)
private String description;
private double price;
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;

public Category getCategory() {
return category;
}

public void setCategory(Category category) {
this.category = category;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

public Long getId() {
return id;
}

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

Sesuaikan kode program untuk class Product seperti kode program di atas.


package model;

import java.beans.PropertyChangeSupport;

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Transient;

/**

*

* @author hendro

*/

@Entity

public class Category implements Serializable {

@Transient

private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column(name="name",length=100)

private String name;

@Column(name="description",length=200)

private String description;

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

}

Sesuaikan kode untuk class Category seperti kode program di atas. Jika anda bingung dengan kode-kode program di atas,  silahkan anda mempelajari tentang Java Persistence API (JPA).

Selanjutnya buatlah 2 Class DAO yaitu CategoryDAO dan ProductDAO. 2 Class ini yang bertanggung jawab untuk melakukan update ke database. Masing-masing class beri package “dao”

package dao;

import java.util.List;
import javax.persistence.EntityManager;
import model.Category;

/**
*
* @author hendro
*/
public class CategoryDAO {
private EntityManager em;
public CategoryDAO(){}

public CategoryDAO(EntityManager em) {
this.em = em;
}
public void save(Category cat) {
if (cat.getId() == null) {
em.persist(cat);
} else {
em.merge(cat);
}
}

public void delete(Category cat) {
em.remove(cat);
}

public Category getCategory(Long id) {
return em.find(Category.class, id);
}

public List getCategories() {
return em.createQuery("select p from Category p").getResultList();
}

}
package dao;

import java.util.List;
import javax.persistence.EntityManager;
import model.Product;

/**
*
* @author hendro
*/
public class ProductDAO {
private EntityManager em;
public ProductDAO(){}

public ProductDAO(EntityManager em) {
this.em = em;
}
public void save(Product prod) {
if (prod.getId() == null) {
em.persist(prod);
} else {
em.merge(prod);
}
}

public void delete(Product prod) {
em.remove(prod);
}

public Product getProduct(Long id) {
return em.find(Product.class, id);
}

public List
getProdudct() {
return em.createQuery("select p from Product p").getResultList();
}

}

upsss.. karena udah mo kuliah saya lanjutin besok ya ;)   sabar.. sabar..

11 comments October 16, 2008

2 hari jadi mahasiswa lagi

halo pembaca sekalian,

sory ini postingan iseng aja :D gak ada hubungan dengan Java hehehehe…

hari ini hari ke-2 saya jadi mahasiswa lagi.. mmmm ternyata jadi mahasiswa itu capek ya :( apalagi kalo ngekos begini wah pokoknya pulang-pulang capek bgt ditambah jogja panasnya minta apyuuun.. Tapi ada juga enaknya artinya beban pekerjaan agak sedikit berkurang (tapi msh ada yang bikin pusing) jadi bisa lebih banyak waktu untuk belajar :D mmmm tentunya belajar Java hehehehe.. dan semoga punya banyak waktu juga untuk ngeblog share pengalaman saya dengan Java buat pembaca semua ;)

Buat pembaca yang di jogja kapan-kapan bisa kopi darat dengan saya, kalo bisa saya ditraktir ya hehehe kan saya udah jadi anak kos sekarang ;)

mmmm.. udah gak sabar nih untuk belajar hal-hal yang baru lagi.. khususnya java :)

Add comment October 14, 2008

Next Posts Previous Posts


 

November 2009
M T W T F S S
« Jul    
 1
2345678
9101112131415
16171819202122
23242526272829
30  

a

Recent Posts

Recent Comments

Hendro Steven on Photos
Hendro Steven on Java Video Tutorial
cad_enter on Membangun GUI dengan Netb…
Ferdian Rahabista on Java Video Tutorial
udin on Contoh Aplikasi Swing dengan…

Top Posts

Archives

Blogroll

Blog Stats

Tags

demo java jamu Java pengunjung selamat seminar java tulisan java tutorial java