我今天在玩 JTable,我发现了一些我认为“不可能”的东西。我找不到这段代码有什么问题。我已经三次检查了代码。让看看这里是否有人能找到问题所在。
我想要实现的是,从 mysql 获取一些数据,在表中显示它们,在表中编辑它们,并在单击保存按钮时更新数据库。
一切正常,除了一个。当我编辑一个单元格时,它确实改变了。但是,当我尝试获取数据(penduduks 的 Arraylist)时,我得到了旧的未更改数据。
如果你无法想象,这里有一个例子。
- 打开程序,一切正常(图1:之前)。
- 我编辑 Nama 专栏,从 Anas 到 Marchell。一切都很顺利(图2:之后)。
- 进而。我点击了 Tester 按钮,调用 getData() 并且输出仍然是 Anas(图 3:为什么)。
问题是,为什么
- tabelnya.java 中的函数测试器
- tabelnya.java 中的函数 getValue(0,1)
- TambahPenduduk.java 中的函数 TesterActionPerformed()
给出了不同的结果?是的,相信我,他们给了我不同的结果。
无论如何,我正在使用 jdk1.7.0_03。哦,还有 Netbeans 7.2。我现在正在下载更新的版本。
前 :
后 :
为什么 :
这是我的代码,我知道它不是一个非常性感的代码,对此我感到非常抱歉:
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");
}
}
}
好的,就是这样,请告诉我我哪里做错了。谢谢...