saya pernah mendapatkan sebuah kritikan bahwa “untuk membuat sebuah table dalam java menggunakan Swing itu terlalu rumit, tidak seperti pada Delphi atau VB atau pada bahasa pemrograman visual lainnya“.
yup, memang untuk membuat sebuah tabel dalam Swing harus menggunakan model dulu, tidak seperti pada Delphi (saya bilang delphi karena kebetulan di kuliahan saya dapet delphi). lantas proses insert, update, dan deletenyapun kita harus menggunakan model tadi, tak seperti di delphi yang dapat kita hapus dari tabelnya langsung.
lantas kenapa harus serumit itu?
ya!!! gak mungkin kalo gak ada alasannya khan?
perlu diketahui kalo Swing dibuat menggunakan konsep MVC (Model View Controller), sehinnga setiap komponen terdiri dari bagian Model, bagian View, dan bagian Controller.
- Model, merupakan bagian yang digunakan untuk menampung data
- View, merupakan bagian untuk menampilkan data
- Controller, merupakan bagian yang digunakan untuk proses manipulasi data.
jadi walaupun ini membuat rumit, tapi ini membuat mudah programmer dalam membuat sebuah aplikasi.
dalam kasus ini, yaitu TABEL, yang merupakan Model adalah TableModel. yang merupakan View adalah JTable. dan yang merupakan controller adalah proses insert, update, delete dan event yang digunakan oleh TableModel dan JTable.
balik lagi ke topik!!!
sekarang kita akan mencoba membuat sebuah class yang akan digunakan oleh TableModel, misal class Orang :
import java.util.Date; /** * * @author usu */ public class Orang { private String nama; private String jenisKelamin; private Date tanggalLahir; private String alamat; public Orang() { } public String getAlamat() { return alamat; } public void setAlamat(String alamat) { this.alamat = alamat; } public String getJenisKelamin() { return jenisKelamin; } public void setJenisKelamin(String jenisKelamin) { this.jenisKelamin = jenisKelamin; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public Date getTanggalLahir() { return tanggalLahir; } public void setTanggalLahir(Date tanggalLahir) { this.tanggalLahir = tanggalLahir; } }
sekarang kita buat sebuah class yang bernama TableModelOrang, yang merupakan class untuk model JTable. dan ingat class tersebut harus turunan dari interface TableModel :
import javax.swing.table.AbstractTableModel; /** * * @author usu */ public class TableModelOrang extends AbstractTableModel { public int getRowCount() { } public int getColumnCount() { } public Object getValueAt(int rowIndex, int columnIndex) { } }
sekarang tinggal kita lengkapi class TableModelOrang diatas menjadi seperti dibawah ini :
import java.util.ArrayList; import javax.swing.table.AbstractTableModel; /** * * @author usu */ public class TableModelOrang extends AbstractTableModel { // Kumpulan Data Orang private ArrayList data; public TableModelOrang() { // Mendeklarasikan Data data = new ArrayList(); } // Menghapus Orang public Orang remove(int index) { Orang forReturn = data.remove(index); // memberi tahu bahwa ada data yang dihapus fireTableRowsDeleted(index, index); return forReturn; } // Mendapatkan Orang public Orang get(int index) { return data.get(index); } // Menambah Orang public boolean add(Orang e) { boolean forReturn = data.add(e); // Memberi tahu bahwa ada data yang masuk fireTableRowsInserted(data.size() - 1, data.size() - 1); return forReturn; } // Mengubah Orang public Orang set(int index, Orang element) { Orang forReturn = data.set(index, element); // Memberitahu bahwa ada data yang diupdate fireTableRowsUpdated(index, index); return forReturn; } // Panjang Baris public int getRowCount() { return data.size(); } // Panjang Kolom public int getColumnCount() { return 4; } // Nilai untuk cell(baris, kolom) public Object getValueAt(int rowIndex, int columnIndex) { switch (columnIndex) { case 0: return data.get(rowIndex).getNama(); case 1: return data.get(rowIndex).getJenisKelamin(); case 2: return data.get(rowIndex).getTanggalLahir(); case 3: return data.get(rowIndex).getAlamat(); default: return null; } } // Nama Kolom pada posisi ke-? public String getColumnName(int column) { switch (column) { case 0: return "Nama"; case 1: return "Jenis Kelamin"; case 2: return "Tanggal Lahir"; case 3: return "Alamat"; default: return null; } } }
sekarang kita buat sebuah form yang digunakan untuk memanipulasi data. buatlah form seperti dibawah ini menggunakan NetBeans IDE:
keterangan :
- untuk nama menggunakan JTextField dan nama variablenya textNama
- untuk jenis kelamin menggunakan JComboBox dan nama variabelnya comboJenisKelamin
- untuk tangal lahir menggunakan JSpinner dan nama variablenya spinnerTanggalLahir
- untuk alamat menggunakan JTextArea dan nama variablenya areaAlamat
- untuk tombol tambah nama variablenya buttonTambah
- untuk tombol ubah nama variablenya buttonUbah
- untuk tombol hapus nama variablenya buttonHapus
- untuk tabel nama variablenya tableOrang
sekarang ubah nilai model comboJenisKelamin menjadi [Laki-Laki, Perempuan] :
setelah itu ubah nilai model untuk spinnerTanggalLahir menjadi Date :
setelah itu buatlah sebuah variable TableModelOrang :
setelah itu inisialisasikan nilai awal model tersebut sebelum pemanggilan metode initComponents(), lalu set model tersebut ke tableOrang :
sekarang coba jalankan, maka akan terlihat seperti ini :
sekarang beri ActionListener ke tombolTambah dengan cara klik kanan tombolnya lalu pilih Events -> Action -> actionPerformed:
private void buttonTambahActionPerformed(java.awt.event.ActionEvent evt) { Orang orang = new Orang(); orang.setNama(textNama.getText()); orang.setJenisKelamin((String) comboJenisKelamin.getSelectedItem()); orang.setTanggalLahir((Date) spinnerTangalLahir.getValue()); orang.setAlamat(areaAlamat.getText()); // menambahkan ke model modelOrang.add(orang); }
beri aksi untuk tombolUbah :
private void buttonUbahActionPerformed(java.awt.event.ActionEvent evt) { if (tableOrang.getSelectedRowCount() == 0) { // Data Table tak ada yang terseleksi javax.swing.JOptionPane.showMessageDialog(this, "Silahkan Seleksi Data Tabel Dulu!"); } else { Orang orang = new Orang(); orang.setNama(textNama.getText()); orang.setJenisKelamin((String) comboJenisKelamin.getSelectedItem()); orang.setTanggalLahir((Date) spinnerTangalLahir.getValue()); orang.setAlamat(areaAlamat.getText()); // Mengubah Data yang terseleksi int index = tableOrang.convertRowIndexToModel(tableOrang.getSelectedRow()); modelOrang.set(index, orang); } }
beri aksi untuk tombolHapus :
private void buttonHapusActionPerformed(java.awt.event.ActionEvent evt) { if (tableOrang.getSelectedRowCount() == 0) { // Data Table tak ada yang terseleksi javax.swing.JOptionPane.showMessageDialog(this, "Silahkan Seleksi Data Tabel Dulu!"); } else { if (javax.swing.JOptionPane.showConfirmDialog(this, "Anda Yakin?") == javax.swing.JOptionPane.OK_OPTION) { // menghapus data yang terseleksi int index = tableOrang.convertRowIndexToModel(tableOrang.getSelectedRow()); modelOrang.remove(index); } } }
sekarang coba jalankan formnya :
see you at next trixxx
Rock with Java!!!!!!
🙂
mas tolong jelasin maksud dari buatlah sebuah variable TableModelOrang?? gimana caranya??
sebelumnya kita kan membuat class TableModelOrang, nah maksud membuat variabel TableModelOrang jadi kita buat sebuah variabel :
private TableModelOrang model;
// dalam contruktor
model = new TableModelOrang();
Mas saya mau tanya dikit..
Kalau ArrayList tuh sanggup nampung data seberapa?
kalu kita mau nampung data dari sebuah tabel pd dataBase
ke Objek ArryList apa nanti Objeknya sanggup nampungnya?
ArrayList tuh sanggup buat nampung data sebanyak mungkin selama memory komputer kita sanggup buat menampungnya,
biasanya kalo memory kita gak sanggup buat menampung data maka akan terjadi error yang namanya “OUT OF MEMORY”,
jadi kesimpulannya ArrayList dapat menampung data sebanyak mungkin selama memory komputer sanggup menampungnya 😀
mas kok saya coba ga bsa jlan ya..da yg error di perintah tableorang.setModel(modelorang);
knpa ya mas..
tulisan errornya kya gini mas
E:\Java\lat3\src\dt_orang.java:174: setModel(javax.swing.table.TableModel) in javax.swing.JTable cannot be applied to (javax.swing.JTable)
tblorang.setModel(tblorang);
1 error
BUILD FAILED (total time: 1 second)
knpa ya mas
Exception in thread “AWT-EventQueue-0” java.lang.RuntimeException: Uncompilable source code – cannot find symbol
symbol : variable modelOrang
location: class TableOrang
at TableOrang.(TableOrang.java:21)
at TableOrang$1.run(TableOrang.java:146)
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 SUCCESSFUL (total time: 1 second)
mohon bantuannya kang..biar fix.
vi agi binggung niich…..
bisa buat programnya melakukan pencarian kayak kita nyari kata di word,trus tekan control+F keluar deh form-a..kita disuruh buat itu..vi udah buat sich pake java tapi vi ga bisa menggil file.txt-a…..:(
bingung dimana nya?
Ping balik: Belajar JaVa « WAHYU FIGHTER
Ping balik: Tutorial Java dari Eko Kurniawan Khannedy « nge-WP@net
Terima Kasih. Semangat Java
bila digabungkan dengan database menggunakan class interface, tau ga caranya.
class interface :
public ArrayList tabelPengarang(String nama, String asal, String keterangan);
pada class yg extend interface :
public ArrayList tabelPengarang(String nama, String asal, String keterangan)
{
ArrayList hasil = new ArrayList();
try {
sqlTabelPengarang = connect.prepareStatement(
“SELECT id, nama, asal, keterangan ” +
“FROM pengarang” +
“WHERE namaPengarang like %” + nama + “% ” +
“and asal like %” + asal + “% ” +
“and keterangan like %” + keterangan + “% “);
ResultSet hasil= sqlTabelPengarang.executeQuery();
while (hasil.next()) {
hasilPengarang.add(hasil.getInt(“id”) + “%” +
hasil.getString(“nama”) + “%” +
hasil.getString(“asal”) + “%” +
hasil.getString(“keterangan”));
}
} catch (SQLException se) {
se.printStackTrace();
}
return hasil;
}
lalu pada table model saya input kan:
final ArrayList array = interfacePengarang.tabelPengarang( nama, asal, keterangan);
hasilnya :
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at tableModel.TableModel.(TableModel.java:42)
at data(data.java:36)
at menu.ActionPerformed(menu.java:376)
at menu.access$1100(menu.java:34)
at menu$FormListener.actionPerformed(menu.java:252)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
at javax.swing.AbstractButton.doClick(AbstractButton.java:337)
at javax.swing.plaf.basic.BasicMenuItemUI$Actions.actionPerformed(BasicMenuItemUI.java:1194)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2849)
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(JMenuBar.java:670)
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(JMenuBar.java:678)
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(JMenuBar.java:678)
at javax.swing.JMenuBar.processKeyBinding(JMenuBar.java:649)
at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:267)
at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:254)
at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2926)
at javax.swing.SwingUtilities.processKeyBindings(SwingUtilities.java:1551)
at javax.swing.UIManager$2.postProcessKeyEvent(UIManager.java:1464)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:714)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:969)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:841)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:668)
at java.awt.Component.dispatchEventImpl(Component.java:4373)
at java.awt.Container.dispatchEventImpl(Container.java:2081)
at java.awt.Window.dispatchEventImpl(Window.java:2458)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
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)
mana yg harus di perbaiki.
Mohon bantuannya….
Bro, kalo untuk penambahan data misal nama nya ga boleh sama gmn ya? Thx infona..
ya tinggal validasi saat Add
cek jika ada data dengan nama yang sama
trus tolak deh proses Add nya 😀
mas, sy mau tnya nehh,,,,,contoh diatas bisa ga pake java 1.4…..
saya kurang tau. tapi jika java 1.4 dah support Swing pasti BISA 😀
nice tutorial
wannabe learn programming? visit to All About Programming
Tips and trick blogging just visit to Let’s Go Blogging
Keep to share
wah tutorial yg bagus nech.. tapikan disitu tiap kolom panjangnya sama. gmn supaya tiap kolom panjangnya berbeda sesuka kita.? jadi panjang tiap kolom bisa kita atur2 sendiri.
kalo itu sih tinggal ubah tableheadernya 😀
program di atas jalan bro?
emg sintax ini jalan bro? emg bs getNama(), getJensiKelamin(), getTanggalLahir(), getAlamat() ???
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return data.get(rowIndex).getNama();
case 1:
return data.get(rowIndex).getJenisKelamin();
case 2:
return data.get(rowIndex).getTanggalLahir();
case 3:
return data.get(rowIndex).getAlamat();
default:
return null;
Setuju sama yang di atas saya.
emang method dari class Orang bisa di panggil sob ?
ndak ada implements disana, jadi bagaimana nie mas echo ?
tolong di jawab 🙂
o0w…
dah nemu masalahnya dimana sob.
di deklarasi Arraylist masih kurang menambahkan class object Orang.
ArrayList data;
public TableModelOrang() {
// Mendeklarasikan Data
data = new ArrayList(Orang);
}
Thanks brother Echo.
tRIM’S ATS INFONYA MAS TAK COBA DULU
kk,,saya mau tanya,,kalau yang saya perhatikan contoh yang diberikan kk kan seperti pada yang diatas dan tutorial video membuat aplikasi swing menggunakn konsep MVC,,setiap inputan dimasukan maka data dapat langsung terlihat di JTable,,,itu dikarena pada construktor formnya
ada method ini
tabelIdentitas.setModel(tableIdentitasModel);(contoh pada video swing mvc)
klo diatas contohnya
tableorang.setModel(modelOrang),
namun contoh diatas kan jika satu form (JFrame/JPanel)terdiri dari JTable dan form inputan,,,
nah masalah saya jika JTable berada pada panel tersendiri dan form inputan menggunakn JDialog,, jadi ketika selesai melakukan inputan pada JDialog,maka pada JTable yang berada di panel langsung ke refresh sendri,,seperti contoh yang k2 berikan pada video swing menggunakn konsep mvc,,
saya binggung untuk menempakan “tableorang.setModel(modelOrang),” berada pada JPanel atau JDialog,,,,mohon pencerahannya k2,,saya sudah coba untuk menempatkan “tableorang.setModel(modelOrang),” pada construktor JPanel,,,tapi tidak tampil datanya,,,mohon bantuannya k2
k2 bisa minta sedikit pencerahannya,,mengenai pertanyaan diatas,,sy masih bingung dengn logikannya, sebelumnya sy ucapkan terima kasih k
saya copy ke netbeans, tapi untuk syntax:
return data.get(rowIndex).getNama();
muncul error:
cannot find symbol
symbol: method getNama();
Ass,wr,wb.
bismilah
mas mau nanyak kalo nampilin data dari tabel yang ngelink database terus ditampilin ke combo ” jadi diklik ditabel ” ini coding di tabel video saya coba yang
cbmkat.setSelectedIndex(String.valueOf(tvideo.getValueAt(mem.getSelectedRows(), 2))); TIDAK BISA, SAYA COBA DENGAN YANG INI
cbmkat.setSelectedItem(mem.getJenisKategori()); JUGA TIDAK BISA
TOLONG BANTUANNYA MAS help me…..
private void tvideoMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
if(evt.getClickCount()==2){
int row = tvideo.getSelectedRow();
video mem = data.get(row);
txtkd.setText(“” + mem.getKd_video());
txtjudul.setText(mem.getJd_video());
// cbmkat.setSelectedIndex(String.valueOf(tvideo.getValueAt(mem.getSelectedRows(), 2))); (TIDAK TAMPIL)
cbmkat.setSelectedItem(mem.getJenisKategori());(TIDAK TAMPIL)
cbjenis.setSelectedItem(mem.getJenis());
txtsutradara.setText(mem.getSutradara());
txtproduksi.setText(mem.getProduksi());
txtstok.setText(mem.getStok());
}
}
trimakasih mas ditunggu bantuannya
Wall,wr.wb
mas saya mw tanya.
di atas ada disebutkan menggunakan class JTable, tp kok di NetBeans saya tidak ada yg namanya JTable ya mas ??
yg ada di NetBeans saya cuma : Java Class, Java Package, Java Interface, JPanel Form, JFrame Form, Entity Class, dan Entity Classes From Database.
apa memang harus menggunakan JTable ?? tidak bs diganti dengan class yg lain ??
sekedar info, saya pakai NetBeans 6.9.1
tolong Jawabannya secepatnya ya mas.. soalnya buat tugas kuliah.. 😀
trima kasih.
JTable itu tinggal km drag ada dari pallete netbeans ke form, disana namanya Table
terimakasih.. banyak .. materinya sangat membantu,… tapi.. masih ada yang belum saya pahami bagaimana caranya.. sortir data pada Jtabel menggunakan abtacttablemodel..
terimaksih sebelumnya…. atas jawabanya…
mas, berarti disini ada berapa file??
orang.java
TableModelOrang.java
atau bagaimana?
please reply.. asap 🙂
mau tanya… kalo di vb6, untuk komponennya ada fasilitas untuk pemberian index untuk mempermudah pemrograman. kalo pake netbeans… ada nggak fasilitas untuk itu… ? saya cari2 kok nggak bisa ya …
memang gak ada 😀
Untuk pengaturan column width? bisa di beri contoh. Trims
Ok Setelah di coba sendiri sudah bisa trims
tableku.getColumnModel().getColumn.setPrefeedWidth(100);
kelas abstractnya gimana???