如何在 JTable 中编辑行
Posted
技术标签:
【中文标题】如何在 JTable 中编辑行【英文标题】:How to edit row in JTable 【发布时间】:2013-12-15 19:38:56 【问题描述】:我在 *** 上看到过类似的问题,但无论如何我无法用这些答案解决我的问题。
我想做的事:
双击 JTable 中的单元格(由于 isCellEditable 方法可编辑) 在我的自定义 TableModel 中保存单元格的新值以打印此新值 更新我的数据库中的数据 (SQlite)我做了什么:
这是我的自定义 TableModel.
import javax.swing.table.AbstractTableModel;
public class KierunkiTableModel extends AbstractTableModel
private boolean DEBUG = false;
private String[] columnNames = "Id", "Data Wstawienia",
"Data Modyfikacji", "Kierunek", "Opis" ;
private Object[][] data = DodEdKierunki.populateData(DodEdKierunki.count);
@Override
public int getRowCount()
return data.length;
@Override
public int getColumnCount()
return columnNames.length;
@Override
public boolean isCellEditable(int row, int col)
return true;
@Override
public Object getValueAt(int rowIndex, int columnIndex)
return data[rowIndex][columnIndex];
@Override
public String getColumnName(int columnIndex)
return columnNames[columnIndex];
public void setValueAt(Object value, int row, int col)
data[row][col] = value;
fireTableCellUpdated(row, col);
这是我打印 JTable 的 JPanel:
.
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import baza.danych.DBConnector;
public class DodEdKierunki extends JPanel implements ActionListener
private JButton dodaj;
private JButton edytuj;
private JButton next;
private JButton previous;
static JTable table;
static Object[][] data = new Object[1][5];
static int count = setValue();
public DodEdKierunki()
dodaj = new JButton("Dodaj");
edytuj = new JButton("Edytuj");
next = new JButton("Pokaż kolejne 5");
previous = new JButton("Pokaż poprzednie 5");
setLayout(new FlowLayout());
dodaj.addActionListener(this);
edytuj.addActionListener(this);
next.addActionListener(this);
previous.addActionListener(this);
add(dodaj);
add(edytuj);
add(next);
add(previous);
table = new JTable(new KierunkiTableModel());
table.setFillsViewportHeight(true);
table.getColumnModel().getColumn(0).setPreferredWidth(30);
table.getColumnModel().getColumn(1).setPreferredWidth(100);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(130);
table.getColumnModel().getColumn(4).setPreferredWidth(130);
table.setEnabled(true);
add(table.getTableHeader(), BorderLayout.PAGE_START);
add(table, BorderLayout.CENTER);
@Override
public void actionPerformed(ActionEvent e)
Object source = e.getSource();
if (source == dodaj)
new DodajKierunekFrame();
else if (source == edytuj)
new EdytujKierunekJFrame();
else if (source == next)
DBConnector db = new DBConnector();
int id = db.getHighestID("Kierunki");
int currId = count + 5;
if (currId <= id)
count = count + 5;
data = populateData(count);
KierunkiTableModel model = new KierunkiTableModel();
model.fireTableDataChanged();
table.setModel(model);
setLayout(new FlowLayout());
table.getColumnModel().getColumn(0).setPreferredWidth(30);
table.getColumnModel().getColumn(1).setPreferredWidth(130);
table.getColumnModel().getColumn(2).setPreferredWidth(130);
table.getColumnModel().getColumn(3).setPreferredWidth(100);
table.getColumnModel().getColumn(4).setPreferredWidth(130);
table.repaint();
db.closeConnection();
else if (source == previous)
if (count > 5)
count = count - 5;
data = populateData(count);
KierunkiTableModel model = new KierunkiTableModel();
model.fireTableDataChanged();
table.setModel(model);
setLayout(new FlowLayout());
table.getColumnModel().getColumn(0).setPreferredWidth(30);
table.getColumnModel().getColumn(1).setPreferredWidth(130);
table.getColumnModel().getColumn(2).setPreferredWidth(130);
table.getColumnModel().getColumn(3).setPreferredWidth(100);
table.getColumnModel().getColumn(4).setPreferredWidth(130);
table.repaint();
static Object[][] populateData(int count)
DBConnector db = new DBConnector();
Object[][] lista = db.selectKierunki(count, "Kierunki");
db.closeConnection();
return lista;
private static int setValue()
DBConnector db = new DBConnector();
int value = db.getHighestID("Kierunki");
db.closeConnection();
return value;
我的问题是:我可以编辑一个单元格,但我不知道如何保存这些更改。所以我的问题是:在 JTable 中编辑一行后如何更改数据模型?
我已阅读http://download.oracle.com/javase/tutorial/uiswing/components/table.html
【问题讨论】:
How to change data model after editing a row in JTable ?
- 你没有做任何特别的事情。当您完成编辑单元格时,编辑器将更新 TableModel。为什么要创建自定义 TableModel。您可以只使用 DefaultTableModel。您可以使用 2D 数组创建模型。
您有两个选择。在调用setValueAt
方法时更新数据库,或者侦听TableModel
以进行更改。个人觉得第一种方法比较简单……
【参考方案1】:
Try this
Use DefaultTableModel if you are not
if(ae.getSource()==update)
int row=table.getSelectedRow();
int n=JOptionPane.showConfirmDialog(mainPanel, "Would you like to update the record?", "Confirm", JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION)
try
Connection con=null;
Statement st=null;
ResultSet rs=null;
ResultSet rs1=null;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url=null,userID=null,password=null;
String dbFileName=null;
String sql=null;
dbFileName = "C:/db.accdb";
url = "jdbc:odbc:Driver=Microsoft Access Driver (*.mdb, *.accdb);"+
"DBQ="+dbFileName+";";
//sql = "SELECT * FROM tblUserProfile";
con=DriverManager.getConnection(url);//,"system","manager"
//con=DriverManager.getConnection("jdbc:odbc:shop");
st=con.createStatement();
rs=st.executeQuery("select * from Credit where TID="+table4.getValueAt(row, 3));
if(rs.next())
s1=rs.getString(1);
s2=rs.getString(2);//accounno
s3=rs.getString(3);//name
s4=rs.getString(4);
s5=rs.getString(5);//paid
s6=rs.getString(6);//unpaid
PreparedStatement smt=con.prepareStatement("select * from Debit where Name=?");
smt.setObject(1, s3);
rs=smt.executeQuery();
if(rs.next())
u1=rs.getString(1);
u2=rs.getString(2);
u3=rs.getString(3);
u4=rs.getString(4);
u5=rs.getString(5);
u6=rs.getString(6);//unpaid
st.executeUpdate("delete from Credit where TID="+table4.getValueAt(row,3));
st.executeUpdate("delete from Debit where Name='"+s3+"'");
tid=Integer.parseInt(table4.getValueAt(row, 3).toString());
date=table.getValueAt(row, 0).toString();
jama=table.getValueAt(row, 1).toString();//s5
baki=table.getValueAt(row, 2).toString();//s6
nett=table4.getValueAt(row, 4).toString();
rs1=st.executeQuery("select * from NettDate where Name='"+s3+"'");
while(rs1.next())
nettdate=rs1.getString(2);
nettbal=rs1.getString(3);
String tpaid=Integer.toString(Integer.parseInt(s5)-Integer.parseInt(jama));
String tunpaid=Integer.toString(Integer.parseInt(s6)-Integer.parseInt(baki));
if(u6.contains("-"))
System.out.println("Contains -");
if(tpaid.contains("-")&tunpaid.contains("-"))
tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
System.out.println("1-"+tupdate);
else if(!tpaid.contains("-")&tunpaid.contains("-"))
tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
System.out.println("2-"+tupdate);
else if(tpaid.contains("-")&!tunpaid.contains("-"))
tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
System.out.println("3-"+tupdate);
else
tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
System.out.println("4-"+tupdate);
else
System.out.println("Not Contains -");
if(tpaid.contains("-")&tunpaid.contains("-"))
tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
System.out.println("1"+tupdate);
else if(!tpaid.contains("-")&tunpaid.contains("-"))
tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
System.out.println("2"+tupdate);
else if(tpaid.contains("-")&!tunpaid.contains("-"))
tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
System.out.println("3"+tupdate);
else
tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
System.out.println("4"+tupdate);
// tupdate=Integer.toString(Integer.parseInt(a)+Integer.parseInt(paid)-Integer.parseInt(unpaid));
// else
// tupdate=Integer.toString(Integer.parseInt(a)-Integer.parseInt(paid)+Integer.parseInt(unpaid));
//
int i=st.executeUpdate("insert into Credit values("+tid+",'"+s2+"','"+s3+"','"+date+"','"+jama+"','"+baki+"','"+nett+"')");
st.executeUpdate("insert into Debit values('"+s2+"','"+s3+"','"+u3+"','"+u4+"','"+date+"','"+tupdate+"')");
//if(Integer.parseInt(table.getValueAt(row, 4).toString())==1)
if(Integer.parseInt(table4.getValueAt(row, 4).toString())==1)
st.executeUpdate("delete from NettDate where Name='"+s3+"'");
st.executeUpdate("insert into NettDate values('"+s3+"','"+date+"','"+nettb+"')");
if(i==0)
String msg="Record not updated Successfully";
String ss="Sorry..........";
int res=JOptionPane.PLAIN_MESSAGE;
JOptionPane.showMessageDialog((Component) null,msg,ss,res);
else
String msg="Record updated Successfully";
String ss="Congratlations..........";
int res=JOptionPane.PLAIN_MESSAGE;
JOptionPane.showMessageDialog((Component) null,msg,ss,res);
//dispose();
jComboBox.requestFocusInWindow();
model.setRowCount(0);
model1.setRowCount(0);
model2.setRowCount(0);
b=0;
a=0;
tj="0";
tb="0";
t=0;
gt="0";
an="0";nam="0";mono="0";cit="0";
DBEngine dbengine = new DBEngine();
data = dbengine.getJamaCustomer(s3);
Object[] d3=data1.get(0).get(0),data1.get(0).get(1),data1.get(0).get(3),data1.get(0).get(4);
model1.addRow(d3);
JTable table5=new JTable(data,header3);
for(int i2=0;i2<table5.getRowCount();i2++)
Object[] d=data.get(i2).get(0),data.get(i2).get(1),data.get(i2).get(2),data.get(i2).get(3),data.get(i2).get(4);
model2.addRow(d);
JTable table1=new JTable(data,header);
for(int i1=0;i1<table1.getRowCount();i1++)
Object[] d=data.get(i1).get(0),data.get(i1).get(1),data.get(i1).get(2);//,data.get(i).get(3),data.get(i).get(4);
model.addRow(d);
for(int i2=0;i2<table1.getRowCount();i2++)
a=a+Integer.parseInt(data.get(i2).get(1));
b=b+Integer.parseInt(data.get(i2).get(2));
tj=Integer.toString(a);
tb=Integer.toString(b);
Object[] d1="Total",tj,tb;//,"","";
Object[] d11="Total",tj,tb,"","";
model.addRow(d1);
model2.addRow(d11);
t=Integer.parseInt(tb)-Integer.parseInt(tj);
gt=Integer.toString(t);
Object[] d2="Nett Balance","",gt;//,"","";
Object[] d21="Nett Balance","",gt,"","";
model.addRow(d2);
model2.addRow(d21);
jlab7.setText(gt);
tablePanel.repaint();
con.close();
catch (ClassNotFoundException ex)
Logger.getLogger(ManageCustomer.class.getName()).log(Level.SEVERE, null, ex);
catch(Exception err)
System.out.println("GG Yes"+err);
else if (n == JOptionPane.NO_OPTION)
try
Connection con=null;
Statement st=null;
ResultSet rs=null;
// ResultSet rs1=null;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url=null,userID=null,password=null;
String dbFileName=null;
String sql=null;
dbFileName = "C:/Program Files/Shop/shop.accdb";
//userID = "Admin";
password = "3064101991";
url = "jdbc:odbc:Driver=Microsoft Access Driver (*.mdb, *.accdb);"+
"DBQ="+dbFileName+";"+
"Pwd="+password+";";
//sql = "SELECT * FROM tblUserProfile";
con=DriverManager.getConnection(url);//,"system","manager"
st = con.createStatement();
//rs=st.executeQuery("select * from Credit where TID="+table.getValueAt(row, 0));
rs=st.executeQuery("select * from Credit where TID="+table4.getValueAt(row, 3));
if(rs.next())
s1=rs.getString(1);
s2=rs.getString(2);//accounno
s3=rs.getString(3);//name
s4=rs.getString(4);
s5=rs.getString(5);//paid
s6=rs.getString(6);//unpaid
model.setRowCount(0);
model1.setRowCount(0);
model2.setRowCount(0);
b=0;
a=0;
tj="0";
tb="0";
t=0;
gt="0";
an="0";nam="0";mono="0";cit="0";
DBEngine dbengine = new DBEngine();
data = dbengine.getJamaCustomer(s3);
Object[] d3=data1.get(0).get(0),data1.get(0).get(1),data1.get(0).get(3),data1.get(0).get(4);
model1.addRow(d3);
JTable table5=new JTable(data,header3);
for(int i2=0;i2<table5.getRowCount();i2++)
Object[] d=data.get(i2).get(0),data.get(i2).get(1),data.get(i2).get(2),data.get(i2).get(3),data.get(i2).get(4);
model2.addRow(d);
JTable table1=new JTable(data,header);
for(int i1=0;i1<table1.getRowCount();i1++)
Object[] d=data.get(i1).get(0),data.get(i1).get(1),data.get(i1).get(2);//,data.get(i).get(3),data.get(i).get(4);
model.addRow(d);
for(int i2=0;i2<table1.getRowCount();i2++)
a=a+Integer.parseInt(data.get(i2).get(1));
b=b+Integer.parseInt(data.get(i2).get(2));
tj=Integer.toString(a);
tb=Integer.toString(b);
Object[] d1="Total",tj,tb;//,"","";
Object[] d11="Total",tj,tb,"","";
model.addRow(d1);
model2.addRow(d11);
t=Integer.parseInt(tb)-Integer.parseInt(tj);
gt=Integer.toString(t);
Object[] d2="Nett Balance","",gt;//,"","";
Object[] d21="Nett Balance","",gt,"","";
model.addRow(d2);
model2.addRow(d21);
jlab7.setText(gt);
tablePanel.repaint();
jComboBox.requestFocusInWindow();
// rs=st.executeQuery("select TID,Date,Paid,Unpaid,Nett from Credit where Name='"+s3+"' order by Date");
// table.setModel(buildTableModel(rs));
con.close();
//pstmt.close();
JOptionPane.showMessageDialog((Component) null,"You choose not to update the data !");
catch (ClassNotFoundException err)
// System.out.println(e);
err.printStackTrace();
catch (Exception ex)
ex.printStackTrace();
System.out.println(ex);
//end btn1
public Vector getJamaCustomer(Object name)throws Exception
Vector<Vector<String>> jamacustomerVector = new Vector<Vector<String>>();
Connection conn = dbConnection();
PreparedStatement pre = conn.prepareStatement("select * from Credit where Name='"+name+"' order by TID");
ResultSet rs = pre.executeQuery();//
while(rs.next())
Vector<String> jamacustomer = new Vector<String>();
//jamacustomer.add(rs.getString(2)); //Empid
jamacustomer.add(rs.getString(4)); //Empid
jamacustomer.add(rs.getString(5)); //Empid
jamacustomer.add(rs.getString(6)); //Empid
jamacustomer.add(rs.getString(1)); //Empid
jamacustomer.add(rs.getString(7)); //Empid
jamacustomerVector.add(jamacustomer);
/*Close the connection after use (MUST)*/
if(conn!=null)
conn.close();
return jamacustomerVector;
//return bakicustomerVector;
【讨论】:
以上是关于如何在 JTable 中编辑行的主要内容,如果未能解决你的问题,请参考以下文章