在Java数据库应用中,往往需要对数据库中表进行增删改查,为了满足一致性,也伴随着Jtable中内容的更新。有两种办法,第一,利用DefaultTableModel model直接使用remove、add和setdata方法即可;然而有时第一种方法并不可行,比如博主我。。。所以我在此分享大家第二种方法,其实也简单,就是先执行sql语句,然后重新查询返回表的内容,然而虽说简单,但是实际过程中会遇到不少问题。
就算不用model直接调用remove等方法,通过先删数据库再重新显示表的内容是会出问题的,每次重读一遍表,它的model会改变,也就是几行几列的样式会变,
此时如何根据model更新表的内容就很重要了,一直使用的方法就是直接用model不断创建table,这样可以更新表的内容和model,但是当你删第二次的时候系统会报错,因为get不到selectRow,原因table.getselectRow的中的table还是最初创建的那张表,而我们想要的则是新的model创建的table,因此就出现只有第一次删除成功第二次及以后都不会得到鼠标选中行,即返回值永远为-1.
然后我试了超多办法,就在刚刚添加一个model新创建table2,然后table2不断重新创建,然后加上滚动条不断创建jsl2,最后讲将jsl2赋值给jsl(最初创建的加了滚动条的table),然后再添加到面板上,完美解决
附上俩Java程序,其中变量与表诉有异还请担待,有啥不懂可以咨询哦
【WHinquiry.java】
package JDBC_Test;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.sql.Date;
import java.util.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.table.*;
public class WHinquiry
{
static DefaultTableModel tm;
static JTable jg_table,J1;
static JFrame jFrame;
static JPanel panel;
static Vector vect;
static JScrollPane jsp,jsp1;
static String[] title = {"货物编号","货物名称","生产商","生产日期","单价"};
static int size=20;//字号及单元格大小
static Color c1 = new Color(81,141,229);//蓝色
Color c2 = new Color(220,220,220);//灰色
static Font f=new Font("宋体",Font.PLAIN,size);
WHinquiry() throws SQLException{
//按照用户指定查询条件返回相应结果,并将结果显示给用户
jFrame = new JFrame("结果");
jFrame.setBounds(600,250,1093,656);
jFrame.getContentPane().setLayout(null);
panel = new JPanel();
panel.setBounds(600,250,1093,656);
panel.setBorder(BorderFactory.createLineBorder(Color.blue));
panel.setLayout(null);
JButton button1=new JButton("删除");
button1.setBounds(0, 370, 113, 27);
panel.add(button1);
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
deletewh mydeletewh=new deletewh();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
});
init();
jg_table = new JTable(tm);//将查询结果加入table中
jg_table.setBounds(120, 180, 849, 330);
jg_table.setToolTipText("显示全部查询结果");
jg_table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);//设置表格调整尺寸模式(自动调整)
jg_table.getTableHeader().setReorderingAllowed(false);//列不能被拖动
jg_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jg_table.setShowVerticalLines(true);//设置是否显示单元格间的分隔线
jg_table.setShowHorizontalLines(true);
TableCellRenderer tcr = new MyTableCellRenderer();//单元格渲染器
((JLabel) tcr).setHorizontalAlignment(JLabel.CENTER);//居中显示
jg_table.setDefaultRenderer(Object.class, tcr);//设置渲染器
jg_table.setDefaultRenderer(Integer.class,tcr);//int型数据居中
jg_table.setDefaultRenderer(Date.class,tcr);//date型数据居中
jg_table.setFont(f);//设置字体
jg_table.setRowHeight(size+6);
//隔行颜色
jg_table.setDefaultRenderer(Object.class,tcr);//字符串事件
jg_table.setDefaultRenderer(Integer.class,tcr);//int型数据
jg_table.setDefaultRenderer(Date.class,tcr);//date型数据
//
jg_table.getTableHeader().setBackground(c1);//设置表头颜色
jg_table.getTableHeader().setFont(f);//设置表头字体
jsp = new JScrollPane(jg_table);//创建带有滚动条的表格
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");//设置样式
} catch (Throwable e) {
e.printStackTrace();
}
jsp.setBounds(120, 180, 849, 330);//表格在界面中的位置
panel.add(jsp);
panel.updateUI();
jFrame.setContentPane(panel);//已设置完该界面
jFrame.setVisible(true);
//把从数据库中获取的数据显示出来
}
static void init() throws SQLException
{
Link mylink=new Link();//使用连接类连接
String sql="select * from GOODS";
mylink.rs = mylink.stmt.executeQuery(sql);
vect = new Vector();//新建行
//vect.removeAllElements();
//实现抽象类AbstractTableModel对象tm中的方法
try
{
while(mylink.rs.next())
{//输出每行查询结果
Vector rec_vector = new Vector();
rec_vector.addElement(mylink.rs.getString(1).trim());//去除字符串后的空格
rec_vector.addElement(mylink.rs.getString(2).trim());
rec_vector.addElement(mylink.rs.getString(3).trim());
rec_vector.addElement(mylink.rs.getDate(4));
rec_vector.addElement(mylink.rs.getInt(5));
//System.out.println(mylink.rs.getInt(5));
vect.addElement(rec_vector);//vect是一个向量,元素为一个元组(rec_vector)
}
}catch(Exception e){e.printStackTrace();}
EndLink myendlink=new EndLink(mylink.conn,mylink.stmt,mylink.rs);//对数据库操作后及时关闭连接
tm = new DefaultTableModel(){
public int getColumnCount(){//列数
return title.length;
}
public int getRowCount(){//行数
// System.out.println(vect.size());
return vect.size();
}
public Object getValueAt(int row,int column){
if(!vect.isEmpty())
return ((Vector) vect.elementAt(row)).elementAt(column);
else
return null;
}
public String getColumnName(int column){//获得表头
return title[column];
}
public void setValueAt(Object value,int row,int column){}
public Class getColumnClass(int c){
return getValueAt(0,c).getClass();
}
public boolean isCellEditable(int row,int column){
return true;
}
};
tm.fireTableStructureChanged(); //更新表格,显示向量vect的内容
//定制表格
jsp1= new JScrollPane(new JTable(tm));
jsp=jsp1;
//jsp.setBorder(BorderFactory.createLineBorder(Color.red));//设置jsp边框颜色
}
public static void main(String[] args) throws SQLException {
WHinquiry mywh=new WHinquiry();
}
}
【deletewh.java】
package JDBC_Test;
import java.sql.SQLException;
public class deletewh {
deletewh() throws SQLException{
init();
WHinquiry.init();
WHinquiry.panel.add(WHinquiry.jsp);
WHinquiry.panel.updateUI();
WHinquiry.jFrame.setContentPane(WHinquiry.panel);//已设置完该界面
WHinquiry.jFrame.setVisible(true);
}
void init(){
int row = WHinquiry.jg_table.getSelectedRow();//没问题
System.out.println("王东旭"+row);
Object val1 = WHinquiry.jg_table.getValueAt(row,0);//没问题
Link mylink=new Link();//使用连接类连接
String sql = "delete from GOODS where Gid='"+val1+"'";//删除语句
try {
mylink.stmt.executeUpdate(sql);
} catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println(val1);
System.out.println("删除成功!");
EndLink myendlink=new EndLink(mylink.conn,mylink.stmt,mylink.rs);//对数据库操作后及时关闭连接
}
}