contoh penerapan konsep MVC di Swing (1)


kemaren ada temen2 yang agak kurang jelas tentang konsep MVC, maksudnya bukan konsepnya, tapi implementasinya di Swing.

so gw bikinin sekarang tutorialnya di blog yang sedang lo baca, supaya ilmunya bukan buat temen gw juga tapi buat semua yang baca πŸ˜€

so gw bahas dulu sedikit tentang konsep MVC πŸ˜€

MVC (Model View Controller) merupakan konsep dimana kalo kita bikin program, semuanya dibagi 3 bagian, Model, View, dan COntroller. apa tuh?

Model itu…, ya model. lebih jelasnya model itu merupakan penampung data. Misal kalo kita punya tabel Identitas di dalam database, maka model metupakan class yang bertugas sebagai penampung data tersebut. jadi bisa dibilang representasi dari tabel yang ada di database (itu kalo aplikasi lo pake database).

View merupakan komponen yang terlihat ato langsung berinteraksi ama user. misal view itu adalah FOrm ato DIalog ato TextBox, Button and lain-lain yang terlihat langsung oleh user dan bisa berinsteraksi langsung dengan user.

Controller merupakan pengkontroll ato kalo gw lebih seneng memangilnya sebagai pemanipulsi di data (Model), jadi dalam controller yang ada cuma proses manipulasi dan controller ini bertugas di belakang layar πŸ˜€

oke, sekarang gw kasih contoh simple tentang penerapan konsep MVC di Swing.

KASUS :

misal gw mo bikin MVC buat data Anggota yang ada dalam Database yang terdiri dari colom kayak dibawah ini :

CREATE TABLE ORANG(
    EMAIL VARCHAR(255) PRIMARY KEY,
    NAMA VARCHAR(255) NOT NULL,
    TANGGAL_LAHIR DATE NOT NULL,
    JENIS_KELAMIN ENUM('PRIA','WANITA') NOT NULL,
    ALAMAT TEXT NOT NULL
);

PERTANYAANNYA :

gimana bikin MVC-nya di Swing ?

nah pertama buat model dari tabel Orang yang ada dalam database tersebut :
gw pake JPA sebagai koneksi Program ke Database, kalo u pake Hibernate, JDO ato JDBC, tinggal disesuaikan saja πŸ˜€

/*
 *  DILARANG MENGUBAH ATAU MENGHAPUS HAK CIPTA INI.
 * 
 *  Hak Cipta 2008 Eko Kurniawan Khannedy.
 * 
 *  Semua isi dalam file ini adalah hak milik dari Eko Kurniawan Khannedy.
 *  Anda tak diperkenankan untuk menggunakan file atau mengubah file ini
 *  kecuali Anda tidak menghapus atau merubah hak cipta ini.
 * 
 *  Pemilik tidak bertanggung jawab jika Anda menyalah gunakan file ini
 *  dan Pemilik TIDAK MENJAMIN apapun atas file ini.
 * 
 *  Anda bisa menghubungi pemilik hak cipta ini di :
 *  email : echo.khannedy@gmail.com
 *  blog : https://eecchhoo.wordpress.com/
 *  ym : echo_khannedy
 */
package org.eecchhoo.wordpress.mvc.model;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

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

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "EMAIL", nullable = false)
    private String email;

    @Column(name = "NAMA", nullable = false)
    private String nama;

    @Column(name = "TANGGAL_LAHIR", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date tanggalLahir;

    @Column(name = "JENIS_KELAMIN", nullable = false)
    private String jenisKelamin;

    @Lob
    @Column(name = "ALAMAT", columnDefinition = "TEXT", nullable = false)
    private String alamat;

    public Orang() {
    }

    public Orang(String email) {
        this.email = email;
    }

    public Orang(String email, String nama, Date tanggalLahir, String jenisKelamin, String alamat) {
        this.email = email;
        this.nama = nama;
        this.tanggalLahir = tanggalLahir;
        this.jenisKelamin = jenisKelamin;
        this.alamat = alamat;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    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;
    }

    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;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (email != null ? email.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 Orang)) {
            return false;
        }
        Orang other = (Orang) object;
        if ((this.email == null && other.email != null) || (this.email != null && !this.email.equals(other.email))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "org.eecchhoo.wordpress.mvc.model.Orang[email=" + email + "]";
    }
}

kalo u gak ngerti soal JPA, jangan terlalu pedulikan annotation @Coloum, @Id or anything, karena itu emang dipake karena gw pake JPA kalo u gak pake JPA hapus aja annotationnya πŸ˜€

sekarang kita buat Viewnya.

gw buat JDialog sebagai VIewnya, terserah u sich, mo JPanel kek, mo JDialog kek asalkan container πŸ˜€ dan gw saranin pake NetBeans, tapi kalo gak mo pake jg gak papa, yang penting harus terlihat seperti pada gambar dibawah ini :

image

ato kalo gak mo pake netbeans, silahkan copy sourcecode ini :

/*
 *  DILARANG MENGUBAH ATAU MENGHAPUS HAK CIPTA INI.
 * 
 *  Hak Cipta 2008 Eko Kurniawan Khannedy.
 * 
 *  Semua isi dalam file ini adalah hak milik dari Eko Kurniawan Khannedy.
 *  Anda tak diperkenankan untuk menggunakan file atau mengubah file ini
 *  kecuali Anda tidak menghapus atau merubah hak cipta ini.
 * 
 *  Pemilik tidak bertanggung jawab jika Anda menyalah gunakan file ini
 *  dan Pemilik TIDAK MENJAMIN apapun atas file ini.
 * 
 *  Anda bisa menghubungi pemilik hak cipta ini di :
 *  email : echo.khannedy@gmail.com
 *  blog : https://eecchhoo.wordpress.com/
 *  ym : echo_khannedy
 */
package org.eecchhoo.wordpress.mvc.view;

/**
 *
 * @author echo
 */
public class DialogOrang extends javax.swing.JDialog {

    private static final long serialVersionUID = 1L;

    public DialogOrang(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }

    //                           
    private void initComponents() {

        labelJudul = new javax.swing.JLabel();
        panel = new javax.swing.JPanel();
        labelEmail = new javax.swing.JLabel();
        labelNama = new javax.swing.JLabel();
        labelKelamin = new javax.swing.JLabel();
        labelTanggal = new javax.swing.JLabel();
        labelAlamat = new javax.swing.JLabel();
        textEmail = new javax.swing.JTextField();
        textNama = new javax.swing.JTextField();
        comboJenisKelamin = new javax.swing.JComboBox();
        textTanggalLahir = new javax.swing.JFormattedTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        textAlamat = new javax.swing.JTextArea();
        tombolOK = new javax.swing.JButton();
        tombolBatal = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Orang");

        labelJudul.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
        labelJudul.setText("ORANG");
        labelJudul.setName("labelJudul"); // NOI18N

        panel.setName("panel"); // NOI18N

        labelEmail.setText("Email");
        labelEmail.setName("labelEmail"); // NOI18N

        labelNama.setText("Nama");
        labelNama.setName("labelNama"); // NOI18N

        labelKelamin.setText("Jeni Kelamin");
        labelKelamin.setName("labelKelamin"); // NOI18N

        labelTanggal.setText("Tanggal Lahir ");
        labelTanggal.setName("labelTanggal"); // NOI18N

        labelAlamat.setText("Alamat");
        labelAlamat.setName("labelAlamat"); // NOI18N

        textEmail.setName("textEmail"); // NOI18N

        textNama.setName("textNama"); // NOI18N

        comboJenisKelamin.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "PRIA", "WANITA" }));
        comboJenisKelamin.setName("comboJenisKelamin"); // NOI18N

        textTanggalLahir.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.DateFormatter(java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG))));
        textTanggalLahir.setName("textTanggalLahir"); // NOI18N
        textTanggalLahir.setValue(new java.util.Date());

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        textAlamat.setColumns(20);
        textAlamat.setRows(5);
        textAlamat.setName("textAlamat"); // NOI18N
        jScrollPane1.setViewportView(textAlamat);

        org.jdesktop.layout.GroupLayout panelLayout = new org.jdesktop.layout.GroupLayout(panel);
        panel.setLayout(panelLayout);
        panelLayout.setHorizontalGroup(
            panelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(panelLayout.createSequentialGroup()
                .addContainerGap()
                .add(panelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                    .add(labelTanggal, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(labelAlamat, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(labelKelamin, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(labelNama, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(labelEmail, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(panelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 501, Short.MAX_VALUE)
                    .add(textNama, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 501, Short.MAX_VALUE)
                    .add(textEmail, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 501, Short.MAX_VALUE)
                    .add(comboJenisKelamin, 0, 501, Short.MAX_VALUE)
                    .add(textTanggalLahir, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 501, Short.MAX_VALUE))
                .addContainerGap())
        );
        panelLayout.setVerticalGroup(
            panelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(panelLayout.createSequentialGroup()
                .addContainerGap()
                .add(panelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(labelEmail)
                    .add(textEmail, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(panelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(labelNama)
                    .add(textNama, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(panelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(labelKelamin)
                    .add(comboJenisKelamin, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(panelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(labelTanggal)
                    .add(textTanggalLahir, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(panelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(labelAlamat)
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 127, Short.MAX_VALUE))
                .addContainerGap())
        );

        tombolOK.setText("OK");
        tombolOK.setName("tombolOK"); // NOI18N

        tombolBatal.setText("Batal");
        tombolBatal.setName("tombolBatal"); // NOI18N

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, panel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                            .add(layout.createSequentialGroup()
                                .add(labelJudul)
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 463, Short.MAX_VALUE))
                            .add(layout.createSequentialGroup()
                                .add(tombolBatal)
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)))
                        .add(tombolOK)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(labelJudul)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(panel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(tombolOK)
                    .add(tombolBatal))
                .addContainerGap())
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-634)/2, (screenSize.height-395)/2, 634, 395);
    }//                         


    // Variables declaration - do not modify                     
    protected javax.swing.JComboBox comboJenisKelamin;
    protected javax.swing.JScrollPane jScrollPane1;
    protected javax.swing.JLabel labelAlamat;
    protected javax.swing.JLabel labelEmail;
    protected javax.swing.JLabel labelJudul;
    protected javax.swing.JLabel labelKelamin;
    protected javax.swing.JLabel labelNama;
    protected javax.swing.JLabel labelTanggal;
    protected javax.swing.JPanel panel;
    protected javax.swing.JTextArea textAlamat;
    protected javax.swing.JTextField textEmail;
    protected javax.swing.JTextField textNama;
    protected javax.swing.JFormattedTextField textTanggalLahir;
    protected javax.swing.JButton tombolBatal;
    protected javax.swing.JButton tombolOK;
    // End of variables declaration                   
}

panjangkan? heheh gw bilang suruh pake NetBeans gak mao πŸ˜›

nach berarti sekarang u dah bikin Viewnya, tinggal menkoneksiin Model ama View, caranya?

pertama kita buat property Model lalu getter dan setternya, jadi tabahin source code kayak gini di DialogOrang :

    private Orang model;

    public Orang getModel() {
        return model;
    }

    public void setModel(Orang model) {
        this.model = model;
    }

setelah itu manipulasi metode getModel ama setModel agar bisa berkomunikasi ama textfield yang ada di JDialog Orang tadi yang kita buat jadi kurang lebih seperti ini :

    public Orang getModel() {
        // buat model baru jika null
        if (model == null) {
            model = new Orang();
        }

        // dapatkan nilai dari input
        model.setAlamat(textAlamat.getText());
        model.setEmail(textEmail.getText());
        model.setJenisKelamin((String) comboJenisKelamin.getSelectedItem());
        model.setTanggalLahir((Date) textTanggalLahir.getValue());

        return model;
    }

    public void setModel(Orang model) {
        // cek apakah model masukan null
        if (model == null) {
            throw new NullPointerException("Model Tak Boleh Null");
        }

        this.model = model;

        // tambahkan ke input
        textAlamat.setText(model.getAlamat());
        textEmail.setText(model.getEmail());
        textNama.setText(model.getNama());
        textTanggalLahir.setValue(model.getTanggalLahir());
        comboJenisKelamin.setSelectedItem(model.getJenisKelamin());
    }

nah sekarang tinggal kita buat controller buat proses insert, sory nich di tutorial ini gw cuma proses insert, karena kalo gw buat juga proses update delete ama select, takutnya tutorialnya kepanjangan πŸ˜€

ok, untuk membuat proses Insert kita gunakan tombol OK yang ada di DialogOrang jadi sekarang kita buat controller (event) buat tombolOK yang ada di DialogOrang :

/*
 *  DILARANG MENGUBAH ATAU MENGHAPUS HAK CIPTA INI.
 * 
 *  Hak Cipta 2008 Eko Kurniawan Khannedy.
 * 
 *  Semua isi dalam file ini adalah hak milik dari Eko Kurniawan Khannedy.
 *  Anda tak diperkenankan untuk menggunakan file atau mengubah file ini
 *  kecuali Anda tidak menghapus atau merubah hak cipta ini.
 * 
 *  Pemilik tidak bertanggung jawab jika Anda menyalah gunakan file ini
 *  dan Pemilik TIDAK MENJAMIN apapun atas file ini.
 * 
 *  Anda bisa menghubungi pemilik hak cipta ini di :
 *  email : echo.khannedy@gmail.com
 *  blog : https://eecchhoo.wordpress.com/
 *  ym : echo_khannedy
 */
package org.eecchhoo.wordpress.mvc.controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import org.eecchhoo.wordpress.mvc.model.Orang;
import org.eecchhoo.wordpress.mvc.view.DialogOrang;

/**
 *
 * @author echo
 */
public class OrangInsert implements ActionListener {

    private DialogOrang dialogOrang;

    public OrangInsert(DialogOrang dialogOrang) {
        this.dialogOrang = dialogOrang;
    }

    public void actionPerformed(ActionEvent e) {
        Orang orang = dialogOrang.getModel();

        // proses insert ke database (disini pake JPA)
        {
            EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PersistenceUnit");

            EntityManager entityManager = entityManagerFactory.createEntityManager();
            EntityTransaction transaction = entityManager.getTransaction();

            try {
                transaction.begin();
                entityManager.persist(orang);
                transaction.commit();
            } catch (Exception ex) {
                transaction.rollback();
            }

            entityManagerFactory.close();
        }

        // hilangkan dialog
        dialogOrang.setVisible(false);
    }
}

ok, sekarang kita tambahkan ke tombolOK yang ada di ViewOrang (DialogOrang) :

        // tambahkan ke tombolOK
        tombolOK.addActionListener(new OrangInsert(this));

nah sekarang kita jalankan, pertama buat dulu Formnya πŸ˜€

/*
 *  DILARANG MENGUBAH ATAU MENGHAPUS HAK CIPTA INI.
 * 
 *  Hak Cipta 2008 Eko Kurniawan Khannedy.
 * 
 *  Semua isi dalam file ini adalah hak milik dari Eko Kurniawan Khannedy.
 *  Anda tak diperkenankan untuk menggunakan file atau mengubah file ini
 *  kecuali Anda tidak menghapus atau merubah hak cipta ini.
 * 
 *  Pemilik tidak bertanggung jawab jika Anda menyalah gunakan file ini
 *  dan Pemilik TIDAK MENJAMIN apapun atas file ini.
 * 
 *  Anda bisa menghubungi pemilik hak cipta ini di :
 *  email : echo.khannedy@gmail.com
 *  blog : https://eecchhoo.wordpress.com/
 *  ym : echo_khannedy
 */
package org.eecchhoo.wordpress.mvc;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.eecchhoo.wordpress.mvc.model.Orang;
import org.eecchhoo.wordpress.mvc.view.DialogOrang;
import sun.text.normalizer.NormalizerBase.Mode;

/**
 *
 * @author echo
 */
public class FormMain extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;

    private JButton button;

    private DialogOrang dialogOrang;

    public FormMain() {
        // tombol buat nambah orang
        button = new JButton("Tambahkan Orang");
        // menambahkan aksi tambah
        button.addActionListener(this);

        // view orang
        dialogOrang = new DialogOrang(this, true);

        // konfigurasi form
        getContentPane().setLayout(new FlowLayout());
        getContentPane().add(button);
        setSize(400, 400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("MVC Orang");
    }

    public void actionPerformed(ActionEvent e) {
        Orang orang = new Orang("", "", new Date(), "PRIA", "");
        dialogOrang.setModel(orang);
        dialogOrang.setVisible(true);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new FormMain().setVisible(true);
            }
        });
    }
}

ok sekarang jalankan πŸ˜€ ini hasilnya :

image

saat u klik tombol “Tambahkan Orang”, maka akan mucul dialog seperti ini :

image

lalu masukkan datanya dan klik tombol OK, misal gw masukkin data seperti digambar ini :

image

dan sekarang terlihat datanya di Database :

image

PERHATIAN!!
tombol Cancel belum berfungsi, jadi tinggal tambah aja aksi untuk menghilangkan DialogOrang pada tombolCancel πŸ˜€

agar tidak pusing, jadi keseluruhan kode di DialogOrang adalah seperti ini :

/*
 *  DILARANG MENGUBAH ATAU MENGHAPUS HAK CIPTA INI.
 * 
 *  Hak Cipta 2008 Eko Kurniawan Khannedy.
 * 
 *  Semua isi dalam file ini adalah hak milik dari Eko Kurniawan Khannedy.
 *  Anda tak diperkenankan untuk menggunakan file atau mengubah file ini
 *  kecuali Anda tidak menghapus atau merubah hak cipta ini.
 * 
 *  Pemilik tidak bertanggung jawab jika Anda menyalah gunakan file ini
 *  dan Pemilik TIDAK MENJAMIN apapun atas file ini.
 * 
 *  Anda bisa menghubungi pemilik hak cipta ini di :
 *  email : echo.khannedy@gmail.com
 *  blog : https://eecchhoo.wordpress.com/
 *  ym : echo_khannedy
 */
package org.eecchhoo.wordpress.mvc.view;

import java.util.Date;
import org.eecchhoo.wordpress.mvc.controller.OrangInsert;
import org.eecchhoo.wordpress.mvc.model.Orang;

/**
 *
 * @author echo
 */
public class DialogOrang extends javax.swing.JDialog {

    private static final long serialVersionUID = 1L;

    private Orang model;

    public DialogOrang(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();

        // tambahkan ke tombolOK
        tombolOK.addActionListener(new OrangInsert(this));
    }

    public Orang getModel() {
        // buat model baru jika null
        if (model == null) {
            model = new Orang();
        }

        // dapatkan nilai dari input
        model.setAlamat(textAlamat.getText());
        model.setEmail(textEmail.getText());
        model.setJenisKelamin((String) comboJenisKelamin.getSelectedItem());
        model.setTanggalLahir((Date) textTanggalLahir.getValue());

        return model;
    }

    public void setModel(Orang model) {
        // cek apakah model masukan null
        if (model == null) {
            throw new NullPointerException("Model Tak Boleh Null");
        }

        this.model = model;

        // tambahkan ke input
        textAlamat.setText(model.getAlamat());
        textEmail.setText(model.getEmail());
        textNama.setText(model.getNama());
        textTanggalLahir.setValue(model.getTanggalLahir());
        comboJenisKelamin.setSelectedItem(model.getJenisKelamin());
    }

    private void initComponents() {
	// ISINYA SAMA KAYAK YANG SEBELUMNYA
    }


    // Variables declaration - do not modify                     
    protected javax.swing.JComboBox comboJenisKelamin;
    protected javax.swing.JScrollPane jScrollPane1;
    protected javax.swing.JLabel labelAlamat;
    protected javax.swing.JLabel labelEmail;
    protected javax.swing.JLabel labelJudul;
    protected javax.swing.JLabel labelKelamin;
    protected javax.swing.JLabel labelNama;
    protected javax.swing.JLabel labelTanggal;
    protected javax.swing.JPanel panel;
    protected javax.swing.JTextArea textAlamat;
    protected javax.swing.JTextField textEmail;
    protected javax.swing.JTextField textNama;
    protected javax.swing.JFormattedTextField textTanggalLahir;
    protected javax.swing.JButton tombolBatal;
    protected javax.swing.JButton tombolOK;
    // End of variables declaration                   
}

enjoy πŸ˜€

nanti kita lanjut ke tutorial MVC yang lainnya πŸ‘Ώ

Iklan

37 pemikiran pada “contoh penerapan konsep MVC di Swing (1)

  1. iya neh echo..klo pake MySQL biasa gmna??
    setingan koneksinya dmana??
    karna setelah gw perhatiin di atas ga ada tuk setingan koneksi ke databasenya…gw pengen bgt tw kalo menggunakn MySQL gmna…
    makch seblumnya yow…

  2. heheh, gw kan dah bilang kalo contohnya pake JPA, jadi gak da proses pengetikan :

    INSERT INTO PEOPLE VALUES (?,?,?,?);
    

    hehehe, mungkin nanti gw kasih tutorial tentang JPA πŸ˜€

  3. thanks banyak bro atas tutorial na,

    bermanfaan banged.. πŸ˜€

    tinggal ane kembangin lagi..

    kl boleh sekalian tutorial tekhnik swingmakeover na dund

    biar lebih keren tampilan na seperti yg ente buat..

    tankyu banged ne atas bimbingan na.

  4. Ping balik: Belajar JaVa « WAHYU FIGHTER

  5. Ping balik: Tutorial Java dari Eko Kurniawan Khannedy « nge-WP@net

  6. saran gw sih buat teman2……
    sebaiknya cobain dulu cari tentang suatu hal…
    kan banyak tuh materi di internet…..
    misalnya blom nyari materi mengenai MVC eh, langsung nyuruh buat tutorial…
    saran gw sih, sebaiknya kita cari dulu sendiri materinya…
    nah, kl emang udah usaha dan nggak bisa baru nanya ke ahlinya…
    *kyk mas echo ini….

    maksih, cuma saran aja……

  7. Wah keren bos….
    Hebat…..
    Salut……
    Bener2 fully java technical..
    Gimana cara spt jadi lo….
    Gua asik belajar2 konsep’a aja…
    Kalo da bnyk code’a…da pusing gua..

  8. bro, buat controller….ini satu event satu kelas controller baru ya…..berarti klo ada dua tombol button….ada dua kelas controller implement actionListener dong.

    repot juga niy bos….bisa disatuin ga siy?

    thanks

  9. om echo klo keseluruhan project dah jadi, truz kita jadiin file jar itu gmn cara buat nya….? n biar bisa di jalanin di komputer orang laen….hehe tq2

  10. mmm….

    saya baru belajar mvc, jadi mohon maaf kalo komentar saya ada yang salah.

    untuk mendapatkan objek ‘model’, kenapa model harus dikoneksikan dengan view (adanya getter&setter pada view)? kenapa tidak menggunakan controller saja, bukankah itu gunanya ‘si pemanipulasi’ & ‘si mak comblang antar view dan model’?

    jadi kalo menggunakan controller kurang lebih seperti ini:

    public class OrangInsert implements ActionListener {

    private DialogOrang dialogOrang;
    private Orang ;

    public OrangInsert(DialogOrang dialogOrang) {
    this.dialogOrang = dialogOrang;

    if (model == null) {
    model = new Orang();
    }

    // dapatkan nilai dari input
    // sori ga tau nama methodnya untuk ngambil inputnya, tapi saya yakin ada
    model.setAlamat(dialogOrang.blablabla.textAlamat.getText());
    model.setEmail(dialogOrang.blablabla.textEmail.getText());
    model.setJenisKelamin(dialogOrang.blablabla.(String) comboJenisKelamin.getSelectedItem());
    model.setTanggalLahir(dialogOrang.blablabla.(Date) textTanggalLahir.getValue());

    }

    Kemudian actionlistener tetep sama:

    // tambahkan ke tombolOK
    tombolOK.addActionListener(new OrangInsert(this));

    Mohon pencerahannya

  11. Mas eko saya sudah ikuti source code yang sudah mas buat tapi saya mentok pada proses input ke databasenya, soalnya database yang saya pake mysql. Jika tidak keberatan mohon mas eko buatkan juga versi database mysql. Atas bantuan y saya ucapkan terima kasih

  12. mas eko…
    method setmodel pada dialog na buat apa ya mas?
    saya liat yang dipake sama controller kan cuma getmodel na,,,
    saya pake jdbc mas gak pake jpa…
    gmna dengan kode saya ini mas

    public class Insert implements ActionListener{

    private Dialog dial;

    public Insert(Dialog dial){
    this.dial = dial;
    }

    public void actionPerformed(ActionEvent e) {
    try {
    mahasiswa mhs = dial.getModel();
    PreparedStatement ps = Database.getConnection().prepareStatement(“insert into data values(?,?,?,?,?,?,?)”);
    ps.setString(1, mhs.getNim());
    ps.setString(2, mhs.getNama());
    ps.setString(3, mhs.getJurusan());
    ps.setString(4, mhs.getKelas());
    ps.setString(5, mhs.getTanggalLahir());
    ps.setString(6, mhs.getAlamat());
    ps.setString(7, mhs.getJenisKelamin());
    ps.executeUpdate();
    } catch (SQLException ex) {
    Logger.getLogger(Insert.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    }

    di view na saya tambahkan listener diatas untuk tombolOK na mas,,,
    mohon koreksi na 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