我已经编写了代码来制作具有JDBC连接的swing应用程序。这些行从包含一些字段的侧面板输入到表中。这些字段输入到数据库中,然后显示在JTable上。我还添加了插入,更新和删除逻辑。插入和更新行工作正常。但是当我尝试删除该行时,出现了异常。
TablePanel.java:
package jdbc;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import com.mysql.cj.xdevapi.Table;
public class TablePanel extends JPanel {
JTable jTable;
DefaultTableModel dtm = null;
String[] columns = { "Sno", "Sname", "Batch", "Trainer", "Score", "Update", "Delete" };
Object[][] rows = null;
JScrollPane jp;
Connection con;
Statement stmt;
static SidePanel sp;
public TablePanel() throws SQLException {
super();
dtm = new DefaultTableModel(rows, columns);
this.jTable = new JTable(dtm);
Dimension dim = new Dimension(600, 1000);
setLayout(new BorderLayout());
this.jp = new JScrollPane(jTable);
add(jp, BorderLayout.CENTER);
jTable.getColumn("Update").setCellRenderer(new ButtonRenderer());
jTable.getColumn("Update").setCellEditor(new ButtonEditor(new JTextField("Update")));
jTable.getColumn("Delete").setCellRenderer(new ButtonRenderer());
jTable.getColumn("Delete").setCellEditor(new ButtonEditor(new JTextField("Delete")));
jp.setSize(600, 600);
con = ConnectionObj.getConnection();
displayTable();
setVisible(true);
}
public void displayTable() throws SQLException {
dtm.getDataVector().removeAllElements();
dtm.fireTableDataChanged();
stmt = con.createStatement();
String sql;
sql = "SELECT * FROM student";
ResultSet rs = stmt.executeQuery(sql);
String arr[] = new String[7];
int flag =0;
while(rs.next()){
// System.out.println(rs.getString(i)+"hello\n");
for(int i=1;i<=5;i++)
{arr[i-1] = rs.getString(i);
flag++;
}if(flag == 5){
arr[5] = "Update";
arr[6] = "Delete";
dtm.addRow(arr);
flag=0;
}
}
}
public void insertRow(Object[] arr) throws SQLException
{
String sql,select_sql;
select_sql = "SELECT sno FROM student where sno = ?";
PreparedStatement psmt1 = con.prepareStatement(select_sql);
psmt1.setString(1, (String)arr[0]);
ResultSet rs1 = psmt1.executeQuery();
if(rs1.next()){
System.out.println(rs1.getString(1));
updateRow(arr);
}
else{
sql = "Insert into student values (?, ?, ?, ?, ?) ";
PreparedStatement psmt = con.prepareStatement(sql);
psmt.setString(1, (String)arr[0]);
psmt.setString(2, (String)arr[1]);
psmt.setString(3, (String)arr[2]);
psmt.setString(4, (String)arr[3]);
psmt.setString(5, (String)arr[4]);
psmt.execute();
}
sp.clearText();
displayTable();
}
public void setSidePanel(SidePanel sp){
this.sp = sp;
}
public void updateRow(Object arr[]) throws SQLException{
// int num = Integer.parseInt(arr[0]);
String str = (String)arr[0];
System.out.println(str+" hi ");
stmt = con.createStatement();
String sql;
sql = "UPDATE student SET sno=?, sname = ?,batch = ?,trainer = ?,score = ? where sno = ?";
PreparedStatement psmt = con.prepareStatement(sql);
psmt.setString(1, (String)arr[0]);
psmt.setString(2, (String)arr[1]);
psmt.setString(3, (String)arr[2]);
psmt.setString(4, (String)arr[3]);
psmt.setString(5, (String)arr[4]);
psmt.setString(6, str);
psmt.execute();
// displayTable();
}
public void deleteRow(int rows2) throws SQLException {
System.out.println("in delete");
stmt = con.createStatement();
String sql;
int count=0;
String id = null;
sql = "SELECT * FROM student";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
System.out.println(rs.getString(1));
if(count==rows2)
{
id = rs.getString(1);
break;
}
count++;
}
String sql2="Delete from student where sno='"+id+"'";
stmt.execute(sql2);
displayTable();
}
}
class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer() {
setOpaque(true);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setText((value == null) ? "" : value.toString());
this.add( new JTextField( value.toString() ) );
this.add( new JButton("Update"));
this.add( new JButton("Delete"));
return this;
}
}
class ButtonEditor extends DefaultCellEditor
{
protected JButton btn;
private String lbl;
private Boolean clicked=false;
public TablePanel tp;
int rows ;
private boolean clicked2=false;
public ButtonEditor(JTextField txt) {
super(txt);
btn=new JButton();
btn.setOpaque(true);
//WHEN BUTTON IS CLICKED
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
});
}
//OVERRIDE A COUPLE OF METHODS
@Override
public Component getTableCellEditorComponent(JTable table, Object obj,
boolean selected, int row, int col) {
//SET TEXT TO BUTTON,SET CLICKED TO TRUE,THEN RETURN THE BTN OBJECT
lbl=(obj==null) ? "":obj.toString();
btn.setText(lbl);
if(lbl.equals("Update"))
clicked=true;
else
clicked2=true;
rows = row;
System.out.println(row+" "+col);
return btn;
}
//IF BUTTON CELL VALUE CHNAGES,IF CLICKED THAT IS
@Override
public Object getCellEditorValue() {
if(clicked)
{
//SHOW US SOME MESSAGE
try {
System.out.println("update");
TablePanel.sp.updatetextPanel(rows);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(clicked2)
{
try {
System.out.println("helll");
TablePanel.sp.deleteRowPanel(rows);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//SET IT TO FALSE NOW THAT ITS CLICKED
clicked=false;
clicked2=false;
return new String(lbl);
}
@Override
public boolean stopCellEditing() {
//SET CLICKED TO FALSE FIRST
clicked=false;
return super.stopCellEditing();
}
@Override
protected void fireEditingStopped() {
// TODO Auto-generated method stub
super.fireEditingStopped();
}
public void setTable(TablePanel tp){
this.tp = tp;
}
}
这是我写的逻辑。在此,我正在使用SidePanel类,该类调用deleteRow()方法。我收到如下错误:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.setValueAt(Unknown Source)
at javax.swing.JTable.setValueAt(Unknown Source)
at javax.swing.JTable.editingStopped(Unknown Source)
at javax.swing.AbstractCellEditor.fireEditingStopped(Unknown Source)
at jdbc.ButtonEditor.fireEditingStopped(TablePanel.java:266)
at jdbc.ButtonEditor$1$1.run(TablePanel.java:198)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
如何纠正此错误?我犯了什么错误?我不明白这是什么错误?请帮忙。预先感谢。