문제

I was playing with JTable today, and i found something that i think "impossible". I can't find what is wrong with this code. I have triple checked the code. Let see if someone here can find whats wrong.

What i want to achieve is, get some data from mysql, show them in a table, edit them in the table, and update the database when i click save button.

Everything is working, except one. When i edit a cell, it did changed. But, when i try to get the data(Arraylist of penduduks), I got the old unchanged data.

If you can't imagine it , here is an example.

  1. Open the program, everything went ok (Picture 1 : before).
  2. I edit column Nama, from Anas to Marchell. Everything went ok too (Picture 2 : after).
  3. And then. I clicked the Tester button, call the getData() and the ouput is still Anas(picture 3 : why).

The question is, why

  • function Tester in tabelnya.java
  • function getValue(0,1) in tabelnya.java
  • function TesterActionPerformed() in TambahPenduduk.java

gave different results? Yes, believe me, they give me a different results.

I'm using jdk1.7.0_03 anyway. Oh, and Netbeans 7.2. I am downloading a newer version right now.

before : uneditted

after : editted column nama from Anas to Marchell

why : enter image description here

here is my code, i know its not a very sexy code, i am so sorry for that :

penduduk.java :

package Penduduk;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;

import com.toedter.calendar.JDateChooserCellEditor;


public class TambahPenduduk extends javax.swing.JFrame
{

    private tabelnya tabModel = new tabelnya();

    public TambahPenduduk()
    {
        initComponents();
        aturTabel();
    }



    private void initComponents()
    {

        BSave = new javax.swing.JButton();
        BAdd = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        tabelPenduduk = new javax.swing.JTable();
        Tester = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        BSave.setText("Save");
        BSave.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                BSaveActionPerformed(evt);
            }
        });

        BAdd.setText("Add");
        BAdd.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                BAddActionPerformed(evt);
            }
        });

        tabelPenduduk.setModel(new tabelnya());
        jScrollPane2.setViewportView(tabelPenduduk);

        Tester.setText("Tester");
        Tester.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                TesterActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(368, 368, 368)
                        .addComponent(BSave)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(BAdd)
                        .addGap(129, 129, 129)
                        .addComponent(Tester))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 1301, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(23, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(15, 15, 15)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(BSave)
                            .addComponent(BAdd)))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(Tester)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 315, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }

    private void BSaveActionPerformed(java.awt.event.ActionEvent evt) {                                      

        save();
    }                                     

    private void BAddActionPerformed(java.awt.event.ActionEvent evt) {                                     

        tabModel.addRow();
    }                                    

    private void TesterActionPerformed(java.awt.event.ActionEvent evt) {                                         

        System.out.println(tabModel.getData().get(0).getNama());
        System.out.println(tabModel.tester());
        System.out.println(tabModel.getValueAt(0, 1));


    }                                        

    public static void main(String args[])
    {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try
        {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels())
            {
                if ("Nimbus".equals(info.getName()))
                {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        }
        catch (ClassNotFoundException ex)
        {
            java.util.logging.Logger.getLogger(TambahPenduduk.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        catch (InstantiationException ex)
        {
            java.util.logging.Logger.getLogger(TambahPenduduk.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        catch (IllegalAccessException ex)
        {
            java.util.logging.Logger.getLogger(TambahPenduduk.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        catch (javax.swing.UnsupportedLookAndFeelException ex)
        {
            java.util.logging.Logger.getLogger(TambahPenduduk.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new TambahPenduduk().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton BAdd;
    private javax.swing.JButton BSave;
    private javax.swing.JButton Tester;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTable tabelPenduduk;
    // End of variables declaration

    private void save()
    {

        ArrayList<penduduk> penduduks = tabModel.getData();// copy data dari tabel , biar gampang
        System.out.println("didalem save : " + penduduks.get(0).getNama());
        System.out.println("dialem sav 2 : " + tabModel.getValueAt(0, 1));
        //  zSystem.out.println("didalem save : "+tabModel.penduduksa.get(0).getNama());
        ArrayList<String> values = new ArrayList<>();
        StringBuilder sqlValues = new StringBuilder();


        for (penduduk orang : penduduks)//ngebentuk valuesnyadari setiap data yang udah dicopy
        {


            String value = "('" + orang.getNik() + "','" + orang.getNama() + "','" + orang.getTempatLahir() + "','" + new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(orang.getTanggalLahir()) + "','" + orang.getGolDarah() + "','" + orang.getAlamat() + "','" + orang.getAgama()
                    + "','" + orang.getStatus() + "','" + orang.getPekerjaan() + "','" + orang.getKewarganegaraan() + "','" + orang.getJenisKelamin() + "','" + orang.getKtp() + "')";
            values.add(value);

        }

        //ngebentuk sqlnya
        for (Iterator<String> it = values.iterator(); it.hasNext();)// santai yang perlu diganti cuma values sama value dibawah
        {
            String value = it.next();// yang ini looh valuenya
            sqlValues.append(value);
            if (it.hasNext())
            {
                sqlValues.append(",");
            }
        }

        System.out.println("insert into penduduk values " + sqlValues + " ON DUPLICATE KEY UPDATE `Nik` = VALUES(`Nik`),`Nama` = VALUES(`Nama`),`TempatLahir` = VALUES(`TempatLahir`),`tanggalLahir` = VALUES(`tanggalLahir`),`GolDarah` = VALUES(`GolDarah`),`Alamat` = VALUES(`Alamat`),`Agama` = VALUES(`Agama`),`Status` = VALUES(`Status`),`Pekerjaan` = VALUES(`Pekerjaan`),`Kewarganegaraan` = VALUES(`Kewarganegaraan`),`JenisKelamin` = VALUES(`JenisKelamin`),`Ktp` = VALUES(`Ktp`)");

        //masukin database
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            Connection c = DriverManager.getConnection("jdbc:mysql://localhost/skripsi", "root", "saphiregem01X");//Setting database
            int hasil = c.createStatement().executeUpdate("insert into penduduk values " + sqlValues + " ON DUPLICATE KEY UPDATE `Nik` = VALUES(`Nik`),`Nama` = VALUES(`Nama`),`TempatLahir` = VALUES(`TempatLahir`),`tanggalLahir` = VALUES(`tanggalLahir`),`GolDarah` = VALUES(`GolDarah`),`Alamat` = VALUES(`Alamat`),`Agama` = VALUES(`Agama`),`Status` = VALUES(`Status`),`Pekerjaan` = VALUES(`Pekerjaan`),`Kewarganegaraan` = VALUES(`Kewarganegaraan`),`JenisKelamin` = VALUES(`JenisKelamin`),`Ktp` = VALUES(`Ktp`)");
            if (hasil > 0)
            {
                JOptionPane.showMessageDialog(this, "Berhasil Tambah Data");
            }



            c.close();

        }
        catch (Exception e)
        {
            System.out.println("gagal  : " + e.getMessage());
            JOptionPane.showMessageDialog(this, "Gagal Tambah Data");
        }
    }

    private void aturTabel()
    {
        JComboBox comboBox = new JComboBox();
        comboBox.addItem("Islam");
        comboBox.addItem("Kristen Protestan");
        comboBox.addItem("Khatolik");
        comboBox.addItem("Hindu");
        comboBox.addItem("Budha");
        comboBox.addItem("Konghucu");

        JComboBox golDarah = new JComboBox();
        golDarah.addItem("A");
        golDarah.addItem("O");
        golDarah.addItem("B");
        golDarah.addItem("AB");

        JComboBox status = new JComboBox();
        status.addItem("Belum Kawin");
        status.addItem("Kawin");
        status.addItem("Janda");
        status.addItem("Duda");

        JComboBox kewarganegaraan = new JComboBox();
        kewarganegaraan.addItem("WNI");
        kewarganegaraan.addItem("WNA");

        JComboBox jenisKelamin = new JComboBox();
        jenisKelamin.addItem("Laki-laki");
        jenisKelamin.addItem("Perempuan");

        JComboBox ktp = new JComboBox();
        ktp.addItem("Ktp DKI");
        ktp.addItem("Ktp non Dki");


        tabelPenduduk.setDefaultEditor(java.util.Date.class, new JDateChooserCellEditor());//ngasih editor yang bagus untuk tipe date
        tabelPenduduk.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(golDarah));
        tabelPenduduk.getColumnModel().getColumn(6).setCellEditor(new DefaultCellEditor(comboBox));// ngasih editor khusus untuk kolom 5

        tabelPenduduk.getColumnModel().getColumn(7).setCellEditor(new DefaultCellEditor(status));
        tabelPenduduk.getColumnModel().getColumn(9).setCellEditor(new DefaultCellEditor(kewarganegaraan));
        tabelPenduduk.getColumnModel().getColumn(10).setCellEditor(new DefaultCellEditor(jenisKelamin));
        tabelPenduduk.getColumnModel().getColumn(11).setCellEditor(new DefaultCellEditor(ktp));



        tabelPenduduk.getColumnModel().getColumn(0).setPreferredWidth(100);
    }
}

penduduk.java:

package Penduduk;

import java.util.Date;

/**
 *
 * @author Anas Muttaqin
 */
public class penduduk {

    private String Nik;
    private String Nama;
    private String TempatLahir;
    private Date tanggalLahir;
    private String GolDarah;
    private String Alamat;
    private String Agama;
    private String Status;
    private String Pekerjaan;
    private String Kewarganegaraan;
    private String JenisKelamin;
    private String Ktp;
    //private Date tanggalLahir;

    public penduduk(String Nik, String Nama, String TempatLahir, Date tanggalLahir, String GolDarah, String Alamat, String Agama, String Status, String Pekerjaan, String Kewarganegaraan, String JenisKelamin, String Ktp) {
        this.Nik = Nik;
        this.Nama = Nama;
        this.TempatLahir = TempatLahir;
        this.tanggalLahir = tanggalLahir;
        this.GolDarah = GolDarah;
        this.Alamat = Alamat;
        this.Agama = Agama;
        this.Status = Status;
        this.Pekerjaan = Pekerjaan;
        this.Kewarganegaraan = Kewarganegaraan;
        this.JenisKelamin = JenisKelamin;
        this.Ktp = Ktp;
    }

    public String getNik() {
        return Nik;
    }

    public void setNik(String Nik) {
        this.Nik = Nik;
    }

    public String getNama() {
        return Nama;
    }

    public void setNama(String Nama) {
        this.Nama = Nama;
    }

    public String getTempatLahir() {
        return TempatLahir;
    }

    public void setTempatLahir(String TempatLahir) {
        this.TempatLahir = TempatLahir;
    }

    public Date getTanggalLahir() {
        return tanggalLahir;
    }

    public void setTanggalLahir(Date tanggalLahir) {
        this.tanggalLahir = tanggalLahir;
    }

    public String getGolDarah() {
        return GolDarah;
    }

    public void setGolDarah(String GolDarah) {
        this.GolDarah = GolDarah;
    }

    public String getAlamat() {
        return Alamat;
    }

    public void setAlamat(String Alamat) {
        this.Alamat = Alamat;
    }

    public String getAgama() {
        return Agama;
    }

    public void setAgama(String Agama) {
        this.Agama = Agama;
    }

    public String getStatus() {
        return Status;
    }

    public void setStatus(String Status) {
        this.Status = Status;
    }

    public String getPekerjaan() {
        return Pekerjaan;
    }

    public void setPekerjaan(String Pekerjaan) {
        this.Pekerjaan = Pekerjaan;
    }

    public String getKewarganegaraan() {
        return Kewarganegaraan;
    }

    public void setKewarganegaraan(String Kewarganegaraan) {
        this.Kewarganegaraan = Kewarganegaraan;
    }

    public String getJenisKelamin() {
        return JenisKelamin;
    }

    public void setJenisKelamin(String JenisKelamin) {
        this.JenisKelamin = JenisKelamin;
    }

    public String getKtp() {
        return Ktp;
    }

    public void setKtp(String Ktp) {
        this.Ktp = Ktp;
    }



}

tabelnya.java :

package Penduduk;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Anas Muttaqin
 */
public class tabelnya extends AbstractTableModel {

    private String[] columnNames = {
        "Nik", "Nama", "Tempat Lahir", "Tanggal lahir", "Golongan Darah", "Alamat", "Agama", "Status", "Pekerjaan", "Kewarganegaraan", "Jenis Kelamin", "Kttp"
    };
    private ArrayList<penduduk> penduduksa;

    public tabelnya() {
        penduduksa = new ArrayList<>();
        dataPenduduk();
    }

    @Override
    public int getRowCount() {
        return penduduksa.size();
    }

    @Override
    public int getColumnCount() {
        return 12;
    }

    @Override
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    public ArrayList<penduduk> getData() {
        return penduduksa;
    }

    public Object tester() {
        return "Didalem tester : "+penduduksa.get(0).getNama();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        switch (columnIndex) {
            case 0:
                return penduduksa.get(rowIndex).getNik();

            case 1:
                System.out.println("Didalem getvalue : "+rowIndex+" " + penduduksa.get(rowIndex).getNama());
                return penduduksa.get(rowIndex).getNama();

            case 2:
                return penduduksa.get(rowIndex).getTempatLahir();

            case 3:
                return penduduksa.get(rowIndex).getTanggalLahir();

            case 4:
                return penduduksa.get(rowIndex).getGolDarah();

            case 5:
                return penduduksa.get(rowIndex).getAlamat();

            case 6:
                return penduduksa.get(rowIndex).getAgama();

            case 7:
                return penduduksa.get(rowIndex).getStatus();

            case 8:
                return penduduksa.get(rowIndex).getPekerjaan();

            case 9:
                return penduduksa.get(rowIndex).getKewarganegaraan();

            case 10:
                return penduduksa.get(rowIndex).getJenisKelamin();

            case 11:
                return penduduksa.get(rowIndex).getKtp();

        }

        return "Something worng at" + rowIndex + "," + columnIndex;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

        //penduduks.get(rowIndex).setNama("");
        switch (columnIndex) {


            case 1:
                penduduksa.get(rowIndex).setNama(String.valueOf(aValue));
                break;
            case 2:
                penduduksa.get(rowIndex).setTempatLahir(String.valueOf(aValue));
                break;
            case 3:
                penduduksa.get(rowIndex).setTanggalLahir((Date) aValue);
                break;
            case 4:
                penduduksa.get(rowIndex).setGolDarah(String.valueOf(aValue));
                break;
            case 5:
                penduduksa.get(rowIndex).setAlamat(String.valueOf(aValue));
                break;
            case 6:
                penduduksa.get(rowIndex).setAgama(String.valueOf(aValue));
                break;
            case 7:
                penduduksa.get(rowIndex).setStatus(String.valueOf(aValue));
                break;
            case 8:
                penduduksa.get(rowIndex).setPekerjaan(String.valueOf(aValue));
                break;
            case 9:
                penduduksa.get(rowIndex).setKewarganegaraan(String.valueOf(aValue));
                break;
            case 10:
                penduduksa.get(rowIndex).setJenisKelamin(String.valueOf(aValue));
                break;
            case 11:
                penduduksa.get(rowIndex).setKtp(String.valueOf(aValue));
                break;

        }

        System.out.println("Didalem setValue "+getValueAt(rowIndex, columnIndex));
        fireTableDataChanged();
    }

    @Override
    public String getColumnName(int column) {
        return columnNames[column];
    }

    //setting apakah cellnya bisa diedit apa kaga.
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }

    public void addRow() {

        penduduksa.add(new penduduk("", "", "", new Date(), "", "", "", "", "", "", "", ""));
        fireTableStructureChanged();
    }

    private void dataPenduduk() {
        try {
            System.out.println("datapenduduk");
            Class.forName("com.mysql.jdbc.Driver");
            Connection c = DriverManager.getConnection("jdbc:mysql://localhost/skripsi", "root", "saphiregem01X");//Setting database
            ResultSet ss = c.createStatement().executeQuery("select * from penduduk");

            while (ss.next()) {
                penduduksa.add(new penduduk(ss.getString("Nik"), ss.getString("Nama"), ss.getString("TempatLahir"), ss.getDate("TanggalLahir"), ss.getString("GolDarah"), ss.getString("Alamat"), ss.getString("Agama"), ss.getString("Status"), ss.getString("Pekerjaan"), ss.getString("Kewarganegaraan"), ss.getString("JenisKelamin"), ss.getString("Ktp")));


            }

            c.close();
        } catch (Exception e) {
            System.out.println("gagal  : " + e.getMessage());
            JOptionPane.showMessageDialog(null, "Gagal Tambah Data");
        }
    }
}

Okey that's all, please tell me where i did wrong. Thank you...

도움이 되었습니까?

해결책

In your class TambahPenduduk you are creating tabModel = new tabelnya();

But then later you create your table with tabelPenduduk.setModel(new tabelnya()); instead of tabelPenduduk.setModel(tabModel);. Therefore you are mixing different instances of or your TableModel, hence you see different results. Simply change your code to this:

tabelPenduduk.setModel(tabModel);

and it should work better already (unless there are other issues in your code, I did not take the time to read it all).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top