0

当我rowcount点击删除按钮打印时,它会打印一些任意值。我正在使用由我创建的表模型作为dt. 它打印一些大的任意值。请帮助更正此代码。

/*
 * UpdateGymFees.java
 *
 * Created on Sep 21, 2012, 2:26:37 PM
 */
package gymmain;

import java.sql.*;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

/**
 *
 * @author sony
 */
public class UpdateGymFees extends javax.swing.JFrame implements Runnable {
    //String  r[] = new String [7];
    //String r1,r2,r3,r4,r5,r6;

    String b[] = new String[4];
    int v[] = new int[5];
    int c[] = new int[100];
    JComboBox c1 = new JComboBox();
    JComboBox c2 = new JComboBox();
    JComboBox c3 = new JComboBox();
    DefaultTableModel dt;
    DB data = new DB();
    Thread t1;

    /**
     * Creates new form UpdateGymFees
     */
    public UpdateGymFees() {

        setVisible(true);
        t1 = new Thread(this);
        t1.start();

        data.dbConnect();
        initComponents();
        jTable1.setRowSelectionAllowed(true);
        jTable1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        String a[][] = new String[1000][1000];
        int i = 0;
        try {
            ResultSet rs1 = data.st.executeQuery("select * from UpdateGymFees");

            // Variables declaration - do not modify

    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private com.toedter.calendar.JDateChooser jDateChooser1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration

    public void run() {
        while (true) {
            try {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(MemberReg.class.getName()).log(Level.SEVERE, null, ex);
                }
                for (int q = 0; q < jTable1.getRowCount(); q++) {
                    if (("" == null ? jTable1.getValueAt(q, 4).toString() != null : !"".equals(jTable1.getValueAt(q, 4).toString()))
                        && ("" == null ? jTable1.getValueAt(q, 5).toString() != null : !"".equals(jTable1.getValueAt(q, 5).toString()))
                        && ("" == null ? jTable1.getValueAt(q, 6).toString() != null : !"".equals(jTable1.getValueAt(q, 6).toString()))) {
                        int z = 4, y = 0;
                        while (z < 7) {
                            b[y] = jTable1.getValueAt(q, z).toString();
                            v[y] = Integer.parseInt(b[y]);
                            z++;
                            y++;
                        }
                        v[3] = v[1] - v[2] + v[0];
                        v[4] = v[1] + v[0];
                        b[3] = Integer.toString(v[3]);
                        jTable1.setValueAt(v[3], q, 7);
                        System.out.print(v[3]);
                    }
                }
            } catch (NullPointerException npe) {
            }
        }
    }
}

编辑

评论中的删除操作代码:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    System.out.println(jTable1.getRowCount());
    int c[] = jTable1.getSelectedRows();
    for (int i = 0; i < jTable1.getSelectedRowCount(); i++) {
        try {
            dt.removeRow(c[i]);
            System.out.println(c[i]);
            System.out.println(jTable1.getSelectedRowCount());
        } catch (ArrayIndexOutOfBoundsException e) {
            JOptionPane.showMessageDialog(null, "Select the row to be deleted");
        }
    }    
}
4

1 回答 1

4

您的删除操作的问题是您删除了错误的行:

 int c[]=jTable1.getSelectedRows(); 
 for(int i=0; i< jTable1.getSelectedRowCount();i++ ) { 
   try{
     dt.removeRow(c[i]);

您首先将行的索引存储在 中c[],然后将它们一一删除。但是,当您删除第一行时,c[]由于表的行数已更改,其余索引变得无效。您要么必须一次全部删除它们,要么调整您的索引。

对您在问题中发布的代码的进一步评论:

  • 数据库连接和访问/修改 Swing 组件不应同时发生Thread。将您的数据库操作移至后台Thread。有关更多信息,请参阅Swing指南中的并发性
  • 永远不要在事件调度线程上休眠(不确定您的休眠是否实际上在 EDT 上,但由于您正在访问摆动组件,Runnable因此它应该在 EDT 上)
  • 您希望"" == null代码中的所有这些检查会发生什么。这将始终评估为false
  • 我也怀疑jTable1.getValueAt(q, 4).toString() != null电话是否会评估为false. 这意味着您有一个toString方法返回的类null,这将非常奇怪。您更有可能JTable包含一个null值,在这种情况下,您已经NullPointerException通过调用toString它触发了
  • s 的所有这些try-catch语句RuntimeException(喜欢NullPointerException并且ArrayOutOfBoundsException通常不需要。请参阅上面提到的原因。如果我在代码中遇到这些,警钟就会响起,我会尝试找出为什么首先发生该异常并避免它,而不是抓住它。
于 2012-10-06T09:10:15.033 回答