java - JTable中的数据没有改变

标签 java swing jtable tablecelleditor jcalendar

我今天在玩 JTable,发现了一些我认为“不可能”的事情。我找不到这段代码有什么问题。我已经对代码进行了三次检查。让我们看看这里是否有人能发现问题所在。

我想要实现的是,从 mysql 获取一些数据,将它们显示在表中,在表中编辑它们,并在单击“保存”按钮时更新数据库。

一切正常,除了一个。当我编辑单元格时,它确实发生了变化。但是,当我尝试获取数据(penduks 的Arraylist)时,我得到了旧的未更改的数据

如果你无法想象,这里有一个例子。

  1. 打开程序,一切正常(图1:之前)。
  2. 我编辑 Nama 栏目,从 Anas 到 Marchell。一切都很顺利(图2:之后)。
  3. 然后。我点击了 Tester 按钮,调用 getData(),输出仍然是 Anas(图 3:为什么)。

问题是,为什么

  • tabelnya.java 中的功能测试器
  • tabelnya.java 中的函数 getValue(0,1)
  • TambahPenduduk.java 中的函数 TesterActionPerformed()

给出了不同的结果?是的,相信我,他们给了我不同的结果。

无论如何我正在使用jdk1.7.0_03。哦,还有 Netbeans 7.2。我现在正在下载更新版本。

之前: uneditted

之后: editted column nama from Anas to Marchell

为什么: enter image description here

这是我的代码,我知道它不是一个非常性感的代码,我对此感到非常抱歉:

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

好了,就这些了,请告诉我哪里做错了。谢谢...

最佳答案

在你的类TambahPenduduk中,你正在创建tabModel = new tabelnya();

但稍后您使用 tabelPenduduk.setModel(new tabelnya()); 而不是 tabelPenduduk.setModel(tabModel); 创建表。因此,您混合了 TableModel 的不同实例,因此您会看到不同的结果。只需将您的代码更改为:

tabelPenduduk.setModel(tabModel);

它应该已经可以更好地工作了(除非您的代码中存在其他问题,否则我没有花时间阅读全部内容)。

关于java - JTable中的数据没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15091358/

相关文章:

java - jScrollPane setVisible 不起作用

java - Spring Boot GET 请求 API

java - Android - 如何声明 'this' 的变量?

java - 从 Java Swing/图形导出到 HTML

java - 将 Jframe Jtextfield 发送到另一个类

来自数据库的 Java 数据显示?

java - 获取Word文档数和PPT中幻灯片数

java - 为什么 Java 在通过反射调用不装箱的方法时不支持访问原始返回值?

java - 在 Swing 中使用大型自定义组件时如何有效地重绘?

java - 从行中获取 id