Pada proses cetak laporan menggunakan Jasper Report, paling sering sumber data yang digunakan adalah data yang berasal dari basisdata. Tentu saja sumber data dari basisdata bukan merupakan satu-satunya cara, masih ada sumber data yang lain yaitu dari collection. Tulisan ini saya tujukan untuk pengenalan JRBeanCollectionDataSource sebagai sumber data menggunakan collection dengan studi kasus cetak laporan dari JTable.
Tulisan ini sekaligus saya buat karena di grup yang saya ikuti ada yang bertanya bagaimana cara cetak laporan dengan data berasal dari JTable. Kalau terbiasa menggunakan JRBeanCollectionDataSource saya jamin pasti tahu bagaimana workaround-nya. Apalagi kalau terbiasa menggunakan AbstractTableModel buat model di JTable akan lebih gampang lagi.
Misal data yang ditampilkan pada JTable dan yang akan dicetak berupa data mahasiswa dengan atribut nim, nama, jenis kelamin dan alamat, maka kita buatkan kelasnya sebagai berikut
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package com.agungsetiawan.jtablereport.entity; /** * * @author awanlabs */ public class Mahasiswa { private String nim; private String nama; private String jenisKelamin; private String alamat; public String getNim() { return nim; } public void setNim(String nim) { this.nim = nim; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getJenisKelamin() { return jenisKelamin; } public void setJenisKelamin(String jenisKelamin) { this.jenisKelamin = jenisKelamin; } public String getAlamat() { return alamat; } public void setAlamat(String alamat) { this.alamat = alamat; } } |
Karena data akan ditampilkan pada JTable maka perlu disiapkan juga modelnya. Saya pakai AbsctractTableModel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package com.agungsetiawan.jtablereport.tablemodel; import com.agungsetiawan.jtablereport.entity.Mahasiswa; import java.util.ArrayList; import java.util.List; import javax.swing.table.AbstractTableModel; /** * * @author awanlabs */ public class MahasiswaTableModel extends AbstractTableModel{ List<Mahasiswa> mahasiswas=new ArrayList<Mahasiswa>(); public List<Mahasiswa> getMahasiswas(){ return mahasiswas; } private final String HEADER[]={"Nim","Nama","Jenis Kelamin","Alamat"}; public void save(Mahasiswa mahasiswa){ mahasiswas.add(mahasiswa); fireTableRowsInserted(getRowCount()-1, getRowCount()-1); } public int getRowCount() { return mahasiswas.size(); } public int getColumnCount() { return 4; } @Override public String getColumnName(int i){ return HEADER[i]; } public Object getValueAt(int rowIndex, int columnIndex) { Mahasiswa mahasiswa=mahasiswas.get(rowIndex); switch(columnIndex){ case 0: return mahasiswa.getNim(); case 1: return mahasiswa.getNama(); case 2: return mahasiswa.getJenisKelamin(); case 3: return mahasiswa.getAlamat(); default: return null; } } } |
Perhatikan pada baris ke-14 yang saya tandai. Di situ terdapat sebuah list yang digunakan untuk menampung data mahasiswa yang dimasukkan oleh pengguna untuk kemudian ditampilkan pada JTable. List ini juga nantinya akan digunakan sebagai sumber data untuk mencetak laporan. Supaya bisa diakses dari luar kelas maka list perlu dibuatkan getter-nya seperti pada baris 16-18. Selanjutnya baris 22-25 adalah method yang digunakan untuk menambahkan objek mahasiswa pada list tadi.
Desain laporan sederhana saja, tambahkan 4 buah fields sesuai dengan atribut mahasiswa, lebih jelasnya silahkan lihat gambar di bawah ini
Nah berikut ini adalah kelas yang bertugas untuk mencetak laporan berdasarkan data yang ada pada JTable, perhatikan bahwa pada method show terdapat parameter berupa list mahasiswa. List ini digunakan sebagai sumber data yang dilewatkan pada constructor dari JRBeanCollectionDataSource (perhatikan baris 27).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package com.agungsetiawan.jtablereport.reporter; import com.agungsetiawan.jtablereport.entity.Mahasiswa; import com.agungsetiawan.jtablereport.service.MahasiswaServiceImpl; import java.io.InputStream; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.engine.xml.JRXmlLoader; import net.sf.jasperreports.view.JasperViewer; /** * * @author awanlabs */ public class Reporter { public void show(List<Mahasiswa> mahasiswas){ try { JRBeanCollectionDataSource collectionDataSource=new JRBeanCollectionDataSource(mahasiswas); InputStream input=MahasiswaServiceImpl.class.getResourceAsStream("/jtablereport.jrxml"); JasperDesign design=JRXmlLoader.load(input); JasperReport report=JasperCompileManager.compileReport(design); JasperPrint jasperPrint=JasperFillManager.fillReport(report, null, collectionDataSource); jasperPrint.setName("Laporan"); JasperViewer jv=new JasperViewer(jasperPrint, false); jv.setTitle("Laporan Mahasiswa"); jv.setVisible(true); } catch (JRException ex) { Logger.getLogger(Reporter.class.getName()).log(Level.SEVERE, null, ex); } } } |
Selanjutnya tinggal memanggil method yang sudah dibuat sebelumnya pada JFrame sebagai tampilan aplikasi. Misal saja desain tampilannya seperti ini, anggap saja bagus 😀
Saat tombol simpan ditekan event-nya adalah
1 2 3 4 5 6 7 8 9 10 11 12 |
private void jButtonSimpanActionPerformed(java.awt.event.ActionEvent evt) { Mahasiswa mahasiswa=new Mahasiswa(); mahasiswa.setNim(jTextFieldNim.getText()); mahasiswa.setNama(jTextFieldNama.getText()); mahasiswa.setJenisKelamin(jTextFieldJenisKelamin.getText()); mahasiswa.setAlamat(jTextFieldAlamat.getText()); mahasiswaTableModel.save(mahasiswa); ..... ..... } |
Pada baris ke-8, dipanggil method save milik tablemodel untuk menyimpan data mahasiswa kedalam list. Dari sini data pada list akan semakin menumpuk dengan semakin bertambahnya input yang dilakukan. Adapun event saat tombol cetak ditekan adalah
1 2 3 4 |
private void jButtonCetakActionPerformed(java.awt.event.ActionEvent evt) { reporter=new Reporter(); reporter.show(mahasiswaTableModel.getMahasiswas()); } |
Pada baris 3 kita ambil nilai list mahasiswa menggunakan getter kemudian dijadikan parameter untuk mencetak laporan. Sudah selesai, segampang itu, tidak susah kan?
Ini adalah screenshot-nya, maaf karena sudah ngantuk jadi salah input data untuk jenis kelamin, ada yang laki-laki ada yang pria, maaf lagi karena terlalu malas seharusnya menggunakan combobox bukan text field.
Semoga bermanfaat
🙂
Happy Coding!!!
maaf mas , itu MahasiswaServiceImpl diambil dari package service , itu apanya ? apakah koneksi atau apa nya , saya masih newbie maaf mas 🙂
mas solusi ireport designer g muncul-muncul gmn yah?