Tempat Berbagi Ilmu dan Pengalaman

Blog ini menampilkan berbagai artikel artikel yang dapat menambah pengetahuan dan membantu para mahasiswa untuk meningkatkan pengetahuan dan membantu tugas kuliah

Pemrograman JTabel dengan ActionListener

JTable extend Action Listener


import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
import java.awt.*;
import java.sql.*;

public class CobaKodeTabel extends JFrame implements ActionListener
{
    JLabel lbljudul = new JLabel("DATA BARANG");
    JLabel lbkode = new JLabel("Kode Barang ");
    JLabel lbnamab = new JLabel("Nama Barang ");
    JLabel lbjenis = new JLabel("Jenis ");
    JLabel lbharga = new JLabel("Harga");
    JLabel lbjumlah = new JLabel("Jumlah");
   
   
    JTextField tfkode = new JTextField();
    JTextField tfnamab = new JTextField();
    JTextField tfjenis = new JTextField();
    JTextField tfharga = new JTextField();
    JTextField tfjumlah = new JTextField();
   
    JButton btsimpan = new JButton("SIMPAN");
    JButton bthapus = new JButton("HAPUS");
    JButton btexit = new JButton("KELUAR");
    JButton btedit = new JButton("EDIT");
    JButton btupdate = new JButton("UPDATE");
   
       
    DefaultTableModel model = new DefaultTableModel();
    JTable tampil = new JTable(model);
    JScrollPane pane = new JScrollPane(tampil);
      
    public CobaKodeTabel()
   
    {  
        super("CobaKodeTabel");
       
lbljudul.setFont(new Font("Arial",Font.BOLD,20));
lbljudul.setBounds(150,5,210,20);          tfkode.setBounds(120,30,100,25);   
lbkode.setBounds(30,30,100,25);          btsimpan.setBounds(250,30,100,25);
lbnamab.setBounds(30,60,100,25);        tfnamab.setBounds(120,60,100,25);                           bthapus.setBounds(250,60,100,25);       tfjenis.setBounds(120,90,100,25);    
lbjenis.setBounds(30,90,100,25);           btexit.setBounds(250,90,100,25);
lbharga.setBounds(30,120,100,25);       tfharga.setBounds(120,120,100,25);           btedit.setBounds(250,120,100,25);        tfjumlah.setBounds(120,150,100,25);    lbjumlah.setBounds(30,150,100,25);      btupdate.setBounds(250,150,100,25);                                         pane.setBounds(10,200,480,250);
       
        add(lbkode);         add(tfkode);          add(btsimpan);     add(lbljudul); 
        add(lbnamab);       add(tfnamab);       add(bthapus);       add(btupdate);  
        add(lbjenis);          add(tfjenis);          add(btexit);           add(tfjumlah);      
        add(lbharga);        add(tfharga);         add(btedit);          add(lbjumlah); 
     
        add(pane);  
       
        btsimpan.addActionListener(this);
        bthapus.addActionListener(this);
        btexit.addActionListener(this);
        btedit.addActionListener(this);
        btupdate.addActionListener(this);
       
        setLayout(null);
        setSize(550,500);
        setVisible(true);
       
        String header [] = {"Kode", "Nama Barang", "Jenis", "Harga", "Jumlah"};
        for(int kolom =0; kolom

        {
            model.addColumn(header[kolom]);
        }
    }
   
    public void actionPerformed(ActionEvent ae)
    {
        String dataKode_Barang = tfkode.getText();
        String dataNama_Barang= tfnamab.getText();
        String dataJenis = tfjenis.getText();
        String dataHarga = tfharga.getText();
        String dataJumlah = tfjumlah.getText();
      

        if(ae.getSource() == btsimpan)
        {
            PreparedStatement ps = null;
            try
            {
                      
            Class.forName("org.sqlite.JDBC");
            Connection koneksi = DriverManager.getConnection("JDBC:sqlite:kuis.db");
            ps = koneksi.prepareStatement("insert into databarang(kode,nama_barang,jenis,harga,Jumlah)          values (?,?,?,?,?)");
            ps.setString(1,dataKode_Barang);
            ps.setString(2,dataNama_Barang);
            ps.setString(3,dataJenis);
            ps.setString(4,dataHarga);
            ps.setString(5,dataJumlah);
            ps.executeUpdate();
            JOptionPane.showMessageDialog(null,"Data Telah Tersimpan");
           
            int row=model.getRowCount ();
                for (int i = 0; i < row; i++)
                {
                    model.removeRow(0);
                }
               
            Statement stat = koneksi.createStatement ();
            ResultSet set = stat.executeQuery("select * from databarang");
           
                while(set.next())
                { model.addRow(new Object [] {set.getString("kode"),set.getString("nama_barang"),set.getString("jenis"),
                    set.getString("harga"),set.getString("jumlah")});
                    tampil.setModel(model);
                }
                tfkode.setText("");
                tfnamab.setText("");
                tfjenis.setText("");
                tfharga.setText("");
                tfjumlah.setText("");
            }catch(Exception ex)
            {
                System.err.println("Error...!SIMPAN!..");
            }
              
        }
       
        else if(ae.getSource() == bthapus)
        {
            tfkode.setText("");
            tfnamab.setText("");
            tfjenis.setText("");
            tfharga.setText("");
            tfjumlah.setText("");
            tfkode.requestFocus();
        }
       
        else if (ae.getSource() == btedit)
        {
            int baris = tampil.getSelectedRow();
           
            String kolomKode_Barang = model.getValueAt(baris, 0).toString();
            tfkode.setText(kolomKode_Barang);
           
            String kolomNama_Barang = model.getValueAt(baris, 1).toString();
            tfnamab.setText(kolomNama_Barang);
           
            String kolomJenis = model.getValueAt(baris, 2).toString();
            tfjenis.setText(kolomJenis);
           
            String kolomHarga = model.getValueAt(baris, 3).toString();
            tfharga.setText(kolomHarga);  
            String kolomJumlah = model.getValueAt(baris, 3).toString();
            tfjumlah.setText(kolomJumlah);  
        }
        else if (ae.getSource() == btupdate)
        {
            //model.insertRow(0, new Object[] {dataNAMA,dataNPM,dataALAMAT,dataKET});
          
        }
              
        else if(ae.getSource() == btexit)
        {
            System.exit(0);
            //new CobaAksiLoginNoDB();
        }
       
       
    }
   
    public static void main (String [] OkeLah)
    {
        CobaKodeTabel cat = new CobaKodeTabel();
    }
}
output:


Pemrograman CRUD

 Pemrograman Visual CRUD dengan Koneksi JDBC:sqlite3

import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.Font;
import java.awt.Color;
import java.sql.*;

    public class sewalosmen1 extends JFrame implements ActionListener
    {
            JLabel lbljudul = new JLabel("PEMESANAN KAMAR");
            JLabel lblIDPelanggan = new JLabel("ID Pelanggan       :");
            JLabel lblNama = new JLabel("Nama                    :");
            JLabel lblTgl = new JLabel("Tanggal Cek In    :");
            JLabel lblAlamat = new JLabel("Alamat                  :");
            JLabel lblJenisKamar = new JLabel("JenisKamar        :");
            JLabel lblMember = new JLabel("Member                :");
            JLabel lbllama = new JLabel("Lama Menginap :");
            JLabel lblTelp = new JLabel("Telp                       :");

            JTextField tfIDPelanggan = new JTextField();
            JTextField tfNama = new JTextField();
            JTextField tfTgl = new JTextField();
            JTextField tfAlamat = new JTextField();

            ButtonGroup btnGrup=new ButtonGroup();
            JRadioButton rDeluxeRoom = new JRadioButton("1. Deluxe Room Rp 275.000/hari");
            JRadioButton rSuiteRoom = new JRadioButton("2. Suite Room Rp 300.000/hari");
            JRadioButton rPresidentRoom = new JRadioButton("3. President Room Rp 370.000/hari");
                  
            ButtonGroup btnGrup1=new ButtonGroup();
            JRadioButton rMember = new JRadioButton("Member");
            JRadioButton rNonMember = new JRadioButton("Non Member");
       
            JTextField tflama = new JTextField();
            JTextField tfTelp = new JTextField();

            JButton btsimpan = new JButton("SIMPAN");
            JButton bthapus = new JButton("HAPUS");
            JButton btexit = new JButton("KELUAR");
            JButton btedit = new JButton("EDIT");
            JButton btupdate = new JButton("UPDATE");
     
            DefaultTableModel model = new DefaultTableModel();
            JTable tampil = new JTable(model);
            JScrollPane pane = new JScrollPane(tampil);
          
            DefaultTableModel model1 = new DefaultTableModel();
            JTable tampil1 = new JTable(model1);
            JScrollPane pane1 = new JScrollPane(tampil1);
               
  public sewalosmen1()
            {
                super("sewalosmen1");
              
                setVisible(true);
                setSize(850,800);
                setLocationRelativeTo(null);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setLayout(null);
              
                lbljudul.setFont(new Font("Monotype Corsiva",Font.BOLD,25));
 lbljudul.setForeground(Color.blue);                       lbljudul.setBounds(250,10,300,25);
 lblIDPelanggan.setBounds(20,50,100,25);            tfIDPelanggan.setBounds(150,50,200,25);    btsimpan.setBounds(500,50,100,25);                    lblNama.setBounds(20,80,100,25);                   tfNama.setBounds(150,80,200,25);                      bthapus.setBounds(500,80,100,25                    lbllama.setBounds(20,110,120,25);                       tflama.setBounds(150,110,200,25);                   btupdate.setBounds(500,110,100,25);                  lblJenisKamar.setBounds(20,140,100,25);         tfTgl.setBounds(150,270,200,25);                        btedit.setBounds(500,140,100,25);                    lblMember.setBounds(20,210,100,25);                 tfAlamat.setBounds(150,300,200,25);                btexit.setBounds(500,170,100,25);                       lblTgl.setBounds(20,270,100,25);                      tfTelp.setBounds(150,330,200,25);                       lblTelp.setBounds(20,330,100,25);     
lblAlamat.setBounds(20,300,100,25);                   btsimpan.setBackground(new Color(102,255,102));  
btupdate.setBackground(new Color(102,255,102));
btsimpan.setForeground(Color.red);                        btupdate.setForeground(Color.red); pane.setBounds(20,380,650,500);                          btsimpan.setFont(new java.awt.Font("Chili",1,12));       btupdate.setFont(new java.awt.Font("Chili",1,12));  pane1.setBounds(670,380,170,500);           bthapus.setBackground(new Color(102,255,102));  btexit.setBackground(new Color(102,255,102));
bthapus.setForeground(Color.red);                           btexit.setForeground(Color.red);
bthapus.setFont(new java.awt.Font("Chili",1,12));    btexit.setFont(new java.awt.Font("Chili",1,12));
rDeluxeRoom.setBounds(150,140,220,25);             btedit.setBackground(new Color(102,255,102));
rSuiteRoom.setBounds(150,160,220,25);                btedit.setForeground(Color.red);
rPresidentRoom.setBounds(150,180,220,25);         btedit.setFont(new java.awt.Font("Chili",1,12));
rMember.setBounds(150,210,190,25);                   pane.setBackground(new Color(98,115,70));
rNonMember.setBounds(150,230,190,25);            pane1.setBackground(new Color(98,115,70));
                                                         
 add(lbljudul);                        add(pane);                   add(rDeluxeRoom);          add(pane1);  add(lblIDPelanggan);             add(tfIDPelanggan);     add(rSuiteRoom);             add(rNonMember);  add(lblNama);                       add(tfNama);               add(rPresidentRoom);       add(btexit);   
add(lbllama);                         add(tflama);                 add(rMember);                  add(btedit);
add(lblJenisKamar);              add(tfTgl);                   add(btsimpan);                   add(lblTelp);   
add(lblMember);                  add(tfAlamat);             add(bthapus);                     add(lblAlamat);      
add(lblTgl);                          add(tfTelp);                  add(btupdate);
                                                                                                              
                btsimpan.addActionListener(this);
                bthapus.addActionListener(this);
                btexit.addActionListener(this);
                btedit.addActionListener(this);
                btupdate.addActionListener(this);
    
                btnGrup.add(rDeluxeRoom);
                btnGrup.add(rSuiteRoom);
                btnGrup.add(rPresidentRoom);
                rDeluxeRoom.setSelected(true);

                btnGrup1.add(rMember);
                btnGrup1.add(rNonMember);
                rMember.setSelected(true);                 
     
                String header [] = {"ID_Pel", "Nama","JenKam","Lama", "Member","TglCekIn","Alamat","Telp"};
                for(int kolom =0; kolom



                {
                     model.addColumn(header[kolom]);
                }
                 String header1 [] = {"Tarif","Diskon","Bayar"};
                for(int kolom =0; kolom                {
                     model1.addColumn(header1[kolom]);
                }
              
            }
                @Override
            public void actionPerformed(ActionEvent act)
            {                          
            
            double lama=Double.parseDouble(tflama.getText());
            double tarif=0,diskon=0,bayar=0;
            Object obj = act.getSource();
          
        String dataID_Pel = tfIDPelanggan.getText();
        String dataNama= tfNama.getText();
        String dataLama= tflama.getText();
        String dataTglCekin =tfTgl.getText();
        String dataAlamat=tfAlamat.getText();
        String dataTelp=tfTelp.getText();
        String []dataJenKam={"rDeluxeRoom","rSuiteRoom","rPresidentRoom"};
        String []dataMember={"rMember","rNonMember"};
       
            if (obj==btsimpan)
            {
                String JenKam="";
                String Member="";
                {

           if (rDeluxeRoom.isSelected())
                    {
                        tarif = lama*275000;
                        JenKam="Deluxe Room";
                    } 
                    else if (rSuiteRoom.isSelected())
                    {
                        tarif = lama*300000;
                        JenKam="Suite Room";
                    }
                        else
                        {
                        tarif = lama*375000;
                        JenKam="President Room";
                    }

           if (rMember.isSelected())
           {
                    Member = " Member";
                    if(lama>=4 && lama<=7)
                    {
                      diskon = 0.20 * tarif;
                    }
                    else if (lama>7)
                    {
                        diskon = 0.35 * tarif;
                    }
                }
           else if
                (rNonMember.isSelected())
                    {
                        Member = "Non Member";
                            if (lama>=4 && lama<=7)
                            {
                                diskon = 0.10 * tarif;
                            }
                            else if (lama>7)
                            {
                               diskon = 0.15 * tarif;
                            }
           }

               bayar = tarif-diskon;
                String [][] data = {{dataID_Pel,dataNama,JenKam,dataLama,Member,dataTglCekin,dataAlamat,dataTelp}};
                Double [][] isSelected ={{tarif,diskon,bayar}};
               for(int isi=0; isi            {
                model.addRow(data[isi]);
            }
        
            for(int isi=0; isi            {
                model1.addRow(isSelected[isi]);
            }
              
             PreparedStatement ps = null;
             PreparedStatement ps1 = null;
            try
            {
                 Class.forName("org.sqlite.JDBC");
            Connection koneksi = DriverManager.getConnection("JDBC:sqlite:produk.db");
            ps = koneksi.prepareStatement("insert into sewalos(ID_Pel,Nama,JenKam,Lama,Member,TglCekIn,Alamat,Telp) values (?,?,?,?,?,?,?,?)");
            ps.setString(1,dataID_Pel);
            ps.setString(2,dataNama);
            ps.setString(3,JenKam);
            ps.setString(4,dataLama);
            ps.setString(5,Member);
            ps.setString(6,dataTglCekin);
            ps.setString(7,dataAlamat);
            ps.setString(8,dataTelp);
         
            ps.executeUpdate();
          
            ps1 = koneksi.prepareStatement("insert into sewalosmen(Tarif,Diskon,Bayar) values (?,?,?)");
            ps1.setDouble(1,tarif);
            ps1.setDouble(2,diskon);
            ps1.setDouble(3,bayar);
                     
            ps1.executeUpdate();
          
            JOptionPane.showMessageDialog(null,"Data Telah Tersimpan");
          
            int row=model.getRowCount ();
                for (int i = 0; i < row; i++)
                {
                    model.removeRow(0);
                }
            int row1=model1.getRowCount ();
                for (int i = 0; i < row; i++)
                {
                    model1.removeRow(0);
                }
              
            Statement stat = koneksi.createStatement ();
            ResultSet set = stat.executeQuery("select * from sewalos");
                     
          
                while(set.next())
                { model.addRow(new Object [] {set.getString("ID_Pel"),set.getString("Nama"),set.getString("JenKam"),set.getString("Lama"),
                    set.getString("Member"),set.getString("TglCekIn"),set.getString("Alamat"),set.getString("Telp")});
                    tampil.setModel(model);
                }
               tfIDPelanggan.setText("");
               tfNama.setText("");
               tflama.setText("");
               tfTgl.setText("");
               tfAlamat.setText("");
               tfTelp.setText("");
             
               ResultSet set1 = stat.executeQuery("select * from sewalosmen");
          
                while(set1.next())
                { model1.addRow(new Object [] {set1.getDouble("Tarif"),set1.getDouble("Diskon"),set1.getDouble("Bayar")});
                    tampil1.setModel(model1);
                }
             
             
            }catch(Exception ex)
            {
                System.err.println("Error...!SIMPAN!..");
            }
        }
              
            if(obj == bthapus)
        {
            tfIDPelanggan.setText("");
            tfNama.setText("");
            tflama.setText("");
            tfTgl.setText("");
            tfAlamat.setText("");
            tfTelp.setText("");
            tfIDPelanggan.requestFocus();
        }
      
        else if (obj == btedit)
        {
            int baris = tampil.getSelectedRow();
          
            String kolomID_Pelanggan = model.getValueAt(baris, 0).toString();
            tfIDPelanggan.setText(kolomID_Pelanggan);
          
            String kolomNama = model.getValueAt(baris, 1).toString();
            tfNama.setText(kolomNama);
          
            String kolomLama_Menginap = model.getValueAt(baris, 2).toString();
            tflama.setText(kolomLama_Menginap);
          
            String kolomAlamat = model.getValueAt(baris, 3).toString();
            tfAlamat.setText(kolomAlamat); 
            String kolomTelp = model.getValueAt(baris, 4).toString();
            tfTelp.setText(kolomTelp); 
        }
        else if(obj == bthapus)
        {
            tfIDPelanggan.setText("");
            tfNama.setText("");
            tflama.setText("");
            tfTgl.setText("");
            tfAlamat.setText("");
            tfTelp.setText("");
            tfIDPelanggan.requestFocus();
        }
       
        else if (obj == btupdate)
        {
            //model.insertRow(0, new Object[] {dataNAMA,dataNPM,dataALAMAT,dataKET});
         
        }
       
        else if (obj == btexit)
        {
            System.exit(0);
        }
      
     
     }
  }

  public static void main (String [] form)
    {
            sewalosmen1 sewalosmen1 = new sewalosmen1();
    }
}

output:






Action Listener

Program JTable dengan Action Listener

import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
import java.awt.*;

public class CobaAksiTabel extends JFrame implements ActionListener
{
    JLabel lbnama = new JLabel("Nama Anda ");
    JLabel lbnpm = new JLabel("NPM Anda ");
    JLabel lbalamat = new JLabel("Alamat Anda ");
    JLabel lbket = new JLabel("Keterangan");
    JTextField tfnama = new JTextField();
    JTextField tfnpm = new JTextField();
    JTextField tfalamat = new JTextField();
    JTextField tfket = new JTextField();
   
    JButton btsimpan = new JButton("SIMPAN");
    JButton bthapus = new JButton("HAPUS");
    JButton btexit = new JButton("KELUAR");
    JButton btedit = new JButton("EDIT");
    JButton btupdate = new JButton("UPDATE");
    DefaultTableModel model = new DefaultTableModel();
    JTable tampil = new JTable(model);
    JScrollPane pane = new JScrollPane(tampil);
      
    public CobaAksiTabel()
    {  
        super("CobaAksiTabel");
       
lbnama.setBounds(30,20,100,25);           btexit.setBounds(230,80,100,25);                                                         btsimpan.setBounds(230,20,100,25);
lbnpm.setBounds(30,50,100,25);   
lbalamat.setBounds(30,80,100,25);
lbket.setBounds(30,110,100,25);
btedit.setBounds(230,110,100,25);
tfket.setBounds(120,110,100,25);    
tfnpm.setBounds(120,50,100,25);                                         
bthapus.setBounds(230,50,100,25);                                          
pane.setBounds(350,20,500,117);
tfnama.setBounds(120,20,100,25);     
btupdate.setBounds(120,140,100,25);
tfalamat.setBounds(120,80,100,25); 

        add(lbnama);    add(tfnama);    add(btsimpan);              add(pane); 
        add(lbnpm);     add(tfnpm);      add(bthapus);                add(btupdate);
        add(lbalamat);  add(tfalamat);   add(btexit);
        add(lbket);       add(tfket);        add(btedit);
                   
                       

       
        btsimpan.addActionListener(this);
        bthapus.addActionListener(this);
        btexit.addActionListener(this);
        btedit.addActionListener(this);
        btupdate.addActionListener(this);
       
        setLayout(null);
        setSize(900,220);
        setVisible(true);
       
        String header [] = {"NAMA", "NPM", "ALAMAT", "KETERANGAN"};
        for(int kolom =0; kolom



        {
            model.addColumn(header[kolom]);
        }
    }
   
    public void actionPerformed(ActionEvent ae)
    {
        String dataNAMA = tfnama.getText();
        String dataNPM = tfnpm.getText();
        String dataALAMAT = tfalamat.getText();
        String dataKET = tfket.getText();

        if(ae.getSource() == btsimpan)
        {
            String [][] data = {{dataNAMA,dataNPM,dataALAMAT,dataKET}};
            for(int isi=0; isi            {
                model.addRow(data[isi]);
            }
        }
       
        else if(ae.getSource() == bthapus)
        {
            tfnama.setText("");
            tfnpm.setText("");
            tfalamat.setText("");
            tfket.setText("");
            tfnama.requestFocus();
        }
       
        else if (ae.getSource() == btedit)
        {
            int baris = tampil.getSelectedRow();
           
            String kolomNAMA = model.getValueAt(baris, 0).toString();
            tfnama.setText(kolomNAMA);
           
            String kolomNPM = model.getValueAt(baris, 1).toString();
            tfnpm.setText(kolomNPM);
           
            String kolomALAMAT = model.getValueAt(baris, 2).toString();
            tfalamat.setText(kolomALAMAT);
           
            String kolomKETERANGAN = model.getValueAt(baris, 3).toString();
            tfket.setText(kolomKETERANGAN);           
        }
        else if (ae.getSource() == btupdate)
        {
            //model.insertRow(0, new Object[] {dataNAMA,dataNPM,dataALAMAT,dataKET});
          
        }
       
        else if(ae.getSource() == btexit)
        {
            System.exit(0);
            //new CobaAksiLoginNoDB();
        }
       
       
    }
   
    public static void main (String [] OkeLah)
    {
        CobaAksiTabel cat = new CobaAksiTabel();
    }
}


output:

J Table

CONTOH PROGRAM JTABLE DENGAN BLUE J




import javax.swing.*;
import java.awt.*;

public class ContohJTable extends JFrame
{
    public static void main (String []args)
    {
        ContohJTable apl = new ContohJTable ();
    }
    public ContohJTable ()
    {
        super ("Tes JTable");
        setSize (400,150);
       
        Object data [] [] = {
            {"11234","Astri Damayanti","Akunting", new Long(2200000)},
            {"11235","Eritria","Pemasaran", new Long(1200000)},
            {"11236","Satria","Personalia", new Long(1200000)},
            {"11237","Tri Setyowati","EDP", new Integer(1500000)},
            {"11238","Fahmi Basya","Akunting", new Long(10000000)},
            {"11239","Suadi Marwan","Akunting", new Long(1100000)},
            {"11241"," Listya","Pemasaran", new Long(1100000)},
        };
       
        String [] judulKolom ={"NIP","Nama","Bagian","Gaji"};
        JTable tabel = new JTable(data, judulKolom);
        JScrollPane scrollpane = new JScrollPane(tabel);
        tabel.setPreferredScrollableViewportSize
        (new Dimension(300,50));
       
        getContentPane().add(scrollpane);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
        //--- Tampilkan frame
        show();
    }
}








OUTPUT:


           

TUGAS JST

TUGAS JARINGAN SYARAF TIRUAN

PENDUGAAN MUTU FISIK JAGUNG DENGAN JARINGAN SYARAF TIRUAN
MENGGUNAKAN PARAMETER WARNA PADA
PENGOLAHAN CITRA DIGITAL


Dewi Rohmani                                   (201143501771)
Shiane Vega Santosa                        (201143501299)
Riky Ferdiansyah                             (201143501476)
R.E Agung Haerorohman                 (201143501471)


Kelas   : R6D

TEKNIK INFORMATIKA

UNIVERSITAS INDRAPRASTA PGRI JAKARTA



1.      PENDAHULUAN

Jagung (Zea mays L.) merupakan salah satu tanaman pangan dunia yang terpenting, selain gandum dan padi. Sebagai sumber karbohidrat utama di Amerika Tengah dan Selatan, jagung juga menjadi alternatif sumber pangan di Amerika Serikat. Penduduk beberapa daerah di Indonesia (misalnya di Madura dan Nusa Tenggara) juga menggunakan jagung sebagai pangan pokok.
Keberhasilan pengembangan jagung tidak hanya ditentukan oleh tingginya produktivitas saja tetapi juga oleh mutu produk, agar komoditas tersebut mampu bersaing, dan memiliki keunggulan kompetitif. Dengan demikian pengendalian mutu memegang peranan yang penting dalam menjamin mutu jagung.
Karena produksi jagung yang cukup besar, maka diperlukan teknik/ metode yang dapat menentukan mutu jagung dengan cepat dan akurat. Permasalahan mutu pada biji bijian khususnya jagung sampai saat ini masih menjadi persoalan penting. Tingginya tingkat kerusakan dan cemaran yang disebabkan oleh cara-cara penanganan yang kurang baik menyebabkan harga jagung jatuh di pasaran, bahkan ketika dihadapkan pada standar mutu yang sudah ditetapkan, jagung tersebut tidak dapat diterima oleh industri pakan. Kerusakan tertinggi biasanya terjadi saat perontokan dengan mesin dan jagung yang telah terkelupas kulitnya akan memudahkan jamur untuk tumbuh secara cepat terutama dari jenis Aspergillus yang berpotensi menghasilkan aflatoksin.
Penelitian ini bertujuan untuk Mengaplikasikan algoritma untuk mengolah citra sampel jagung dengan berbagai persentase butir utuh, butir rusak, butir warna lain dan kadar kotoran, dan Melakukan kalibrasi atau training JST dengan memasukkan nilai RGB sample yang telah diketahui persentasi butir utuh, butir berjamur, butir rusak, butir warna lain dan kadar kotoran sehingga diperoleh nilai pembobot akhir.


Bahan dan Alat

Bahan utama yang digunakan dalam penelitian ini adalah Sampel biji jagung yang dikumpulkan dari berbagai daerah di Sumatra Barat yaitu, Dhamasraya, Pasaman Barat, dan Kabupaten Agam dengan demikian diharapkan sampel yang diperoleh mempunyai kualitas yang bervariasi.
Jumlah sampel yang diambil 200 macam yang akan digunakan untuk trainning JST (160 sampel) dan validasi (40 sampel). Alat yang digunakan untuk pengambilan citra adalah box sampel yang terbuat dari papan berukuran 60 cm x 30 cm x 20 cm, dan dilapisi kertas warna hitam untuk penutup agar cahaya dari luar tidak dapat masuk dan penempatan sampel dengan pencahayaan dari segala arah sehingga tidak menimbulkan bayangan dan cahayanya tidak terlalu kuat agar tidak menimbulkan efek pantulan pada permukaan sampel (Ahmad, 2005). Lampu Visalux Energy Saver 8 W Cool Daylight 360 LM 45 Lm/ W yang berjumlah 4 buah fungsinya adalah sebagai sumber cahaya, sehingga objek yang akan diuji lebih jelas warnanya.
 Keempat buah lampu ini dipasang pada dinding box menghadap pada benda. Kamera digital dengan merek  anon IXUS 115 HS dengan jarak 30 cm dan resolusi 14 megapixel berfungsi untuk mengambil citra jagung yang akan di uji, yang kemudian citra dipanggil menggunakan perangkat lunak pengolah citra diuji mutunya. Perangkat lunak (software) berfungsi untuk melakukan proses identifikasi kelas mutu fisik jagung. Perangkat lunak dengan menggunakan seperangkat computer jenis Acer Aspire 4736 Processor Intel Core 2 Duo T6600 VGA Intel GMA 4500MHD Memory 3GB sebagai fungsi pustaka untuk penulisan dan pengolahan program dirancang sedemikian rupa segingga sangat mudah untuk dioperasikan oleh siapapun.



2.1 Pengolahan Citra Digital
Pengolahan citra dimulai dengan proses thresholding, yaitu proses pemisahan citra berdasarkan batas nilai tertentu, dalam proses thresholding citra warna diubah menjadi citra biner. Tujuan proses thresholding adalah untuk membedakan objek dengan latar belakangnya. Setelah proses thresholding proses selanjutnya adalah proses penghitungan nilai-nilai parameter antara lain R, G, B, RGB rata-rata (color value), indeks R (Ired), indeks G (Igreen), indeks B (Iblue), hue (corak), saturation (kejenuhan) dan intensity (selanjutnyadisingkat HSI) dari tiap-tiap pixel citra jagung, baik bagian biji utuh, bagian biji rusak, bagian biji pecah maupun bagian biji berjamur.

2.2 Penentuan Mutu Fisik sebagai Nilai Acuan
Penentuan mutu fisik biji jagung dengan prosedur sebagai berkut:
1. Sebanyak 40 biji jagung pipil yang terdiri dari 10 biji jagung utuh, 10 biji jagung pecah, 10 biji jagung rusak dan 10 biji jagung berjamur yang digunakan untuk validasi.
2. Biji jagung diletakkan pada tempat sampel.
3. Lakukan prosedur pengerjaaan seperti pada pengambilan citra.
4. Untuk ke-40 biji jagung tersebut akan diolah kembali dengan program jaringan syaraf tiruan dan menjadi penentuan mutu biji jagung yang nantinya akan di olah dengan program jaringan syaraf tiruan.

2.3 Pengukuran Parameter RGB (Red, Green dan Blue)
Paramater RGB diperoleh dari tiap tiap pixel warna pada citra biji jagung yang merupakan nilai intensitas untuk masing-masing warna merah, hijau, dan biru. Nilai rata-rata dari R,G dan B dijumlahkan untuk mendapatkan color value atau RGB rata-rata.

2.4 Pengukuran parameter Indeks R, Indeks G dan Indeks B
Perhitungan indeks warna merah/indeks R (Ired), indeks warna hijau/indeks G (Igreen), dan indeks warna biru/indeks B (Iblue) menggunakan rumus pada persamaan (1), (2), dan (3). Intensitas warna merah dibagi dengan penjumlahan dari nilai intensitas warna merah, hijau, dan biru sehingga menghasilkan nilai parameter indeksR. Intensitas warna hijau dibagi dengan penjumlahan dari nilai intensitas warna merah, hijau, dan biru sehingga menghasilkan nilai parameter indeks G. Intensitas warna biru dibagi dengan penjumlahan dari nilai intensitas warna merah, hijau, dan biru sehingga menghasilkan nilai parameter indeks B. Perhitungan parameter Indeks R, G, dan B diperoleh dari tiap-tiap pixel pada citra jagung. Model warna RGB dapat juga dinyatakan dalam bentuk indeks warna RGB dengan rumus sebagai berikut (Ahmad, 2005; Arimurthy, dkk., 1992):
                                          Indeks warna merah

        
Dengan R, G, dan B masing-masing merupakan besaran yang menyatakan nilai intensitas warna merah, hijau, dan biru. (5), dan (6). Intensity dihitung dengan menjumlahkan nilai intensitas warna merah, hijau, dan biru (RGB) setiap pixel dari citra sehingga diperoleh algoritma untuk citra abu-abu.


3.     Penyusunan Model Jaringan Syaraf Tiruan (JST)

Model JST yang digunakan merupakan modifikasi Sandra, 2007. JST terdiri dari tiga lapisan yakni lapisan input, lapisan output dan lapisan tersembunyi. Lapisan input berguna untuk menerima masukan yang berupa variabel citra yakni mean, standar deviasi, entropi, energi, kontras dan homogenitas, serta indeks warna r, g dan b. lapisan output terdiri dari kriteria kualitas fisik berupa persentase butir utuh, butir berjamur, butir rusak, butir warna lain dan kadar kotoran. Lapisan tersembunyi mempunyai beberapa noda (simpul). Pada penelitian ini dilakukan pengujian JST dengan tiga, lima, tujuh dan sembilan simpul. Menurut Rich dan Knight (1983), algoritma pelatihan backpropagation adalah sebagai berikut:
1. Inisialisasi
a. Normalisasi data input xi dan data target tk dalam range (0,1)
b. Seluruh pembobot (wij dan vjk) awal diberi nilai random antara - 1,1
c. Inisialisasi aktivasi thresholding unit, x0 = 1 dan h0 = 1    
2. Aktivasi unit-unit dari input layer ke hidden layer dengan fungsi :

dengan:
wij = pembobot w yang menghubungkan node unit ke-I pada input layer dengan noda ke-j pada hidden layer
3. Aktivasi unit-unit dari hidden layer ke output layer dengan fungsi:

dengan:
σ = konstanta logistik (logistic contant)
vjk = pembobot v yang menghubungkan node unit ke-j pada hidden layer dengan noda ke-k pada output layer
4. Menghitung error dari unit-unit pada output layer (δk) dan menyesuaikannya dengan bobot vjk

5. Menghitung error dari unit-unit pada hidden layer (τj) dan menyesuaikannya dengan bobot wij


6. Trainning set (learning) dihentikan jika yk mendekati tk. Proses pembelajaran juga dapat dihentikan berdasarkan error. Salah satu persamaan untuk nilai error adalah dengan menggunakan Root Mean Square Error (RMSE).

7. Pengulangan (iterasi)
Keseluruhan proses ini dilakukan pada setiap contoh dari setiap iterasi sampai sistem mencapai keadaaan optimum. Iterasi mencakup pemberian contoh pasangan input dan output, perhitungan nilai aktivasi dan perubahan nilai pembobot.

3.1 Validasi Model Jaringan Syaraf Tiruan
Validasi dilakukan sebagai proses pengujian kinerja jaringan terhadap contoh yang belum diberikan selama proses training. Kinerja jaringan dapat dinilai berdasarkan nilai RMSE (Root Mean Square Error) pada proses generalisasi terhadap contoh data inputoutput baru, nilai RMSE dapat dinotasikan sebagai:

dengan:
p = nilai prediksi yang dihasilkan oleh jaringan
a = nilai target yang diberikan pada jaringan
n = jumlah contoh data pada set data
validasi Proses validasi dilakukan dengan memasukkan nilai data contoh set inputoutput yang diberikan selama proses training. Jika ANN telah berhasil selama proses pelatihan dan validasi maka system tersebut sudah dapat digunakan untuk aplikasi selanjutnya. Urutan proses pengolahan citra dan Jaringan Syaraf Tiruan untuk identifikasi mutu fisik jagung seperti pada Gambar 2.

4. HASIL DAN PEMBAHASAN

4.1 Program Pengolahan Citra Digital
Tujuan dari program pengolahan citra adalah untuk mendapatkan data-data numerik dari biji jagung seperti : biji jagung utuh, biji jagung rusak, biji jagung pecah, dan biji jagung berjamur.
Tampilan program seperti gambar berikut:






Diagram Alir Prosedur Penelitian Pengolahan Citra Digital dan Jaringan Syaraf Tiruan


5.      Sifat Mutu Fisik Jagung Berdasarkan Hasil Pengolahan Citra

5.1  Karakteristik RGB pada Bji Jagung Utuh, Biji Jagung Rusak, Biji Jagung Pecah, dan Biji Jagung Berjamur

Karakteristik RGB untuk biji jagung utuh, biji jagung rusak, biji jagung pecah, dan biji jagung berjamur seperti ditunjukkan pada Gambar 4, 5 dan 6. Pada Gambar 4 dapat dilihat rata-rata nilai indeks red untuk biji jagung utuh, biji jagung berjamur adalah 0,463406, 0,452763, 0,43337 dan 0,420678. Disini dapat dilihat bahwa biji utuh memiliki warna kuning yang lebih jelas dan terang, sedangkan untuk biji berjamur telah mengalami kerusakan pada kondisi fisik yang disebabkan oleh jamur ataupun cendawan sehingga menyebabkan warna kuning tersebut tidak lagi seperti kondisi semula. Menurut SNI 01-3920-1995, jagung kuning adalah jagung yang terdiri sekurang-kurangnya 90 % berwarna kuning dan sebanyak-banyaknya 10 % jagung berwarna lain. Biji jagung berwarna merah dianggap sebagai jagung kuning, asal warna merah ini tidak disebabkan oleh penyakit dan hanya menutupi kurang dari 50 % permukaan biji seluruhnya. Pada Gambar 5 nilai sebaran warna hijau (indeks green), rata-ratanya untuk biji jagung utuh, biji jagung rusak, biji jagung pecah, dan berjamur masing masing adalah 0,375374, 0,389392, 0,372527, dan 0,36406. Nilai tertinggi didominasi oleh biji jagung rusak dan terendah oleh biji berjamur. Untuk indeks green ini pada tiap kategori biji jagung yang sangat mendekati adalah biji jagung utuh dan biji jagung pecah, sedangkan untuk biji jagung berjamur nilainya sangat signifikan. Perbedaan ini lebih memudahkan program dalam membedakan antara biji jagung rusak dengan biji jagung berjamur, tetapi sangat sulit dalam membedakan antara biji jagung utuh dengan biji jagung pecah karena memiliki karakteristik indeks green yang hamper sama. Menurut Winarno (2002) warna hijau yang terdapat pada buah-buahan dan sayur-sayuran tergantung kepada kandungan warna hijau dari buah-buahan dan sayur-sayuran tersebut. Sebaran warna biru (indeks blue) dapat dilihat pada Gambar 6, rata-ratanya untuk biji jagung utuh, biji jagung rusak, biji jagung pecah, dan biji jagung berjamur masing-masing adalah 0,16122, 0,157845, 0,194103, dan 0,215263. Nilai tertinggi didominasi oleh biji jagung berjamur dan yang terendah oleh biji jagung rusak, sehingga dimungkinkan bahwa kedua jenis biji jagung ini lebih mudah dibedakan berdasarkan indeks blue. Hal ini disebabkan biji berjamur mempunyai warna yang tidak lagi kuning yaitu mendekati warna ungu dimana warna ungu menurut Mohsenin (1984) adalah perpaduan warna biru dengan warna merah keunguan. Namun demikian untuk biji jagung utuh dan biji jagung rusak rata-ratanya hampir sama sehingga akan menyulitkan dalam proses pemisahannya.

5.2 Karakteristik HSI pada Bji Jagung Utuh, Biji Jagung Rusak, Biji Jagung Pecah, dan Biji Jagung Berjamur

Karakteristik HSI untuk biji jagung utuh, biji jagung rusak, biji jagung pecah, dan biji jagung berjamur seperti ditunjukkan pada Gambar 7, 8 dan 9. Pada gambar 7 terlihat rata-rata sebaran nilai H (Hue) untuk biji jagung utuh, biji jagung rusak, biji jagung pecah, dan biji jagung berjamur adalah 45,46255, 50,47406, 54,36785, dan 46,72355. Dari sini terlihat bahwa rata-rata tertinggi terdapat pada biji jagung pecah dan terendah adalah biji jagung utuh karena warna biji jagung pecah jauh lebih jenuh daripada biji jagung rusak dan biji jagung berjamur, sehingga perbedaan nilai hue ini akan memudahkan dalam proses training dalam membedakan biji jagung pecah dan biji jagung utuh. Menurut Ahmad (2005) warnawarna jenuh terletak sepanjang garis tepi segitiga HIS, semakin jenuh warna semakin tinggi nilai coraknya. Nilai hue warna hijau terletak antara 500 – 560 ηm sedangkan nilai hue warna merah lebih besar dari 660 ηm Mohsenin, 1984). Nilai hue tidak bisa dijadikan faktor pembeda dalam pemutuan biji jagungberdasarkan SNI, karena hampir semua nilai hue biji rusak mempunyai nilai yang sama dengan biji pecah. Sebaran nilai S (Saturation) dapat dilihat pada gambar 8, rata-ratanya untuk
biji jagung utuh, biji jagung rusak, biji jagung pecah, dan biji jagung berjamur masing-masing adalah 0,51764, 0.526257, 0,420669, dan 0,358636. Nilai tertinggi dimiliki oleh biji jagung rusak dan terendah oleh biji jagung berjamur. Jika dilihat perbedaan karakteristik kejenuhan pada setiap kategori biji kecil sangat mudah dibedakan, sehingga ada indikasi bahwa sistem pemrograman pengolah citra akan mudah untuk membedakan jenis biji jagung ini berdasarkan tingkat kejenuhan warnanya. Menurut Mohsenin (1984) kuantitatif saturasi adalah jarak representative titik obyek ke warna putih. Jadi semakin jenuh warna semakin dekat ke titik putih) maka saturasinya semakin tinggi. Pada gambar 9 dibawah ini sebaran warna I (Intensity), rata-ratanya untuk biji jagung utuh, biji jagung rusak, biji jagung pecah, dan biji jagung berjamur masing-masing adalah 82,43059, 74,47758, 83,88208, dan 75,87588. Nilai tertinggi dimiliki oleh biji jagung pecah dan terendah oleh biji jagung rusak, sehingga dimungkinkan bahwa kedua jenis biji ini lebih mudah dibedakan berdasarkan intensitasnya. Sedangkan untuk kedua jenis biji jagung yang lain juga dapat lebih memudahkan program dalam mengidentifikasi, karena perbedaan nilai yang memiliki batas tertentu. Menurut Ahmad (2005) nilai intensitas dari suatu citra adalah penjumlahan nilai RGB dibagi tiga. Biji jagung pecah dan biji jagung utuh mempunyai nilai RGB yang tinggi bila dibandingkan dengan biji jagung rusak dan biji jagung berjamur.

5.3 Hasil Grading Biji Jagung
Tujuan program grading adalah untuk mendapatkan mutu/grade dari biji jagung yang dianalisa. Program grading hampir sama dengan validasi, input yang digunakan adalah file citra dan file bobot yaitu indeks red, indeks green, hue, saturation dan intensity. Sedangkan output berupa mutu biji jagung kelas SNI diantaranya biji utuh, biji pecah, biji rusak dan biji berjamur. Output untuk program ini berupa bilangan biner seperti Tabel 2 berikut. Hasil keluaran dari JST menggunakan threshold 0.5, dimana hasil keluaran yang besar dari 0.5 dibulatkan menjadi 1 (satu) dan yang kecil 0.5 dibulatkan menjadi 0 (nol).

5.4  Hasil Pembelajaran (Trainning)
Data untuk biji jagung dengan semua kategorinya berjumlah 160, yang terdiri dari 40 biji jagung utuh, 40 biji jagung rusak, 40 biji jagung pecah, dan 40 biji jagung berjamur. Iterasi yang  igunakan untuk training antara 5000 sampai dengan 50 000 iterasi. Pada iterasi ke 50 000 ini diperoleh nilai akurasi total yang maksimal yaitu 80 %. Perkembangan hasil training ANN adalah penurunan error (RMSE). Pada gambar 10 terlihat bahwa semakin besar jumlah iterasi maka nilai error akan semakin kecil, karena prinsip kerja training adalah melakukan perbaikan bobot antar lapisan dengan cara memperkecil error.

5.5  Hasil Validasi Keseluruhan Biji Jagung
Validasi dilakukan terhadap setiap jenis biji jagung. Data yang digunakan untuk validasi masing-masing adalah 10 biji untuk tiap jenisnya, sehingga total kesemuanya berjumlah 40 biji jagung. Dengan nilai iterasi 50 000 dan nilai RMSE 0,0007599, maka didapat persentase untuk setiap biji jagung adalah 80 % biji jagung utuh, 70 % biji jagung rusak, 60 % biji jagung pecah, dan 70 % biji jagung berjamur.


6.  KESIMPULAN DAN SARAN

6.1  Kesimpulan
1. Aplikasi komputer yang digunakan untuk pemutuan biji jagung terdiri dari dari tiga bagian program, yaitu program pengolahan citra digital, program training Artificial Neural Network (ANN), dan program validasi. Sedangkan hasil dari program validasi akan menentukan keluaran dari jenis biji jagung yang telah ditentukan.
2. Program pengolahan citra telah mampu membangkitkan data-data numerik dari citra biji jagung berupa indeks R (Ired), indeks G (Igreen), indeks B (Iblue), hue (corak), saturation (kejenuhan), dan intensity. Kesemua data tersebut merupakan input data yang nanti akan digunakan pada artificial neural network.
3. Nilai parameter dari masing-masing indeks R (Ired), indeks G (Igreen), indeks B (Iblue), hue (corak), saturation (kejenuhan), dan intensity hampir mendekati antara satu jenis biji jagung dengan dengan jenis lainnya sehingga menyebabkan ANN seringkali salah dalam melakukan
pendugaan jenis biji jagung khususnya pada saat validasi, sehingga dalam tahap akhir menentukan mutu biji jagung pun menjadi tidak akurat.
4. Perkembangan hasil training ANN adalah penurunan error (RMSE). Error adalah selisih antara output training dengan output data (target). Semakin besar jumlah iterasi maka nilai error akan semakin kecil, karena prinsip kerja training adalah melakukan perbaikan bobot antar lapisan dengan cara memperkecil error. Proses training dilakukan sampai dengan 50 000 iterasi dengan nilai RMSE yang didapat adalah 0,00007599.
5. Pemodelan JST yang dikembangkan yang terdiri dari 6 lapisan input, 5 hidden layer dan 3 utput layer menghasilkan akurasi pada proses training sebesar 70 %, terdiri dari 80 % biji jagung utuh, 70 % biji jagung rusak, 60 % biji jagung pecah, dan 70 % biji jagung berjamur.
6. Program ANN lebih mudah untuk membedakan antara biji jagung pecah dan biji jagung berjamur dibandingkan dengan biji jagung lainnya. Hal ini disebabkan karena kedua jenis biji jagung ini memiliki karakteristik nilai-nilai parameter yang khas dibandingkan dengan jenis
biji jagung lainnya.
7. Adanya biji jagung yang tidak bias dikenali dalam pedugaan semua kategori jenis biji jagung disebabkan kurangnya nilai-nilai input parameter yang menjadi karakteristik dari biji tersebut.

6.2  Saran
1. Perlu dilakukan training dengan cara menambah parameter input sehingga ciri ataupun karakteristik dari setiap biji jagung dapat lebih mudah untuk dikenali oleh program ANN.
 2. Perlu dilakukan training dengan menambah ragam sampel khususnya untuk biji rusak dan biji pecah.
3. Perlu pengembangan program yang dapat bekerja secara terintegrasi, yaitu dengan menggunakan Gelombang NIR (near infra red) dan kamera yang dapat mengambil citra

objek tanpa disimpan dalam file dan langsung dianalisa.