Java 为什么for循环只返回JTable中的第一个值?

Java 为什么for循环只返回JTable中的第一个值?,java,swing,if-statement,for-loop,jtable,Java,Swing,If Statement,For Loop,Jtable,所以我用这个for循环遍历第一列中的值。然后,如果用户输入的值等于字符串hold中的值,if语句将删除该行。我可以删除第一行,但不能删除之后的任何行。我做错了什么 private void addButtonActionPerformed(java.awt.event.ActionEvent evt){ //将行添加到表中 String name=JOptionPane.showInputDialog(“输入”); DefaultTableModel=(DefaultTableModel)jT

所以我用这个for循环遍历第一列中的值。然后,如果用户输入的值等于字符串hold中的值,if语句将删除该行。我可以删除第一行,但不能删除之后的任何行。我做错了什么

private void addButtonActionPerformed(java.awt.event.ActionEvent evt){
//将行添加到表中
String name=JOptionPane.showInputDialog(“输入”);
DefaultTableModel=(DefaultTableModel)jTable1.getModel();
model.addRow(新对象[]{name,“JohnSMith@example.com", "03-16/05-17"});
}                                         
私有void deleteButtonActionPerformed(java.awt.event.ActionEvent evt){
//从表中删除行
字符串dName=JOptionPane.showInputDialog(“回车”);
DefaultTableModel=(DefaultTableModel)jTable1.getModel();
int rows=jTable1.getRowCount();
对于代码中的(int i=0;i问题:

  • 您的for循环中有一个
    break;
    可能放错了位置。您是否打算将其作为
    if(hold.equals(name)){}
    块的一部分

  • 您正在使用视图索引从模型中删除行。返回视图中的行数,而不是模型中的行数。由于筛选的原因,视图中的行数可能与模型中的行数不同

    然后使用索引迭代行,在视图中查找值,然后从模型中删除。当在JTable中进行排序时,这将失败

    您需要使用and将视图索引转换为模型索引,反之亦然

    对于列,用户可以通过将列拖动到不同的位置来重新排列列。调用
    jTable1.getValueAt(i,0)
    将为您提供视图中第一列的值,而不是模型中的值。查看并查看


  • 当这些行被删除时,模型中的行数当然会发生变化,因此使用
    ihmmm DefaultTableModel检查已实现所有通知程序,请正确删除-调用模型上的fireTableChanged。(这可能毫无意义:-)@mKorbel是,但最后一个“备选方案”是直接使用/修改
    DefaultTableModel
    (a
    Vector
    )的底层
    dataVector
    )。这需要启动该方法。我把它放在第二个位置,我想首选第一个选择。我总是抱怨
    DefaultTableModel
    无法使用
    迭代器来迭代底层数据向量。我认为DefaultTableModel.removeRow(索引);正在删除此行而无需调用重复的方法,DataVector可直接从DefaultTableModel访问,而无需强制转换到TableModel@mKorbel这两种方法是完全不同的删除行的方法。使用第一种方法不需要
    fireXXXChanged
    方法,因为您正确地指出了out、 我已经更新了答案,以更清楚地表明这两种选择是不同的。
     private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {                                          
       //adds a row to table
            String name = JOptionPane.showInputDialog("Enter");
            DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
            model.addRow(new Object[]{name, "JohnSMith@example.com", "03-16/05-17"});
    
    }                                         
    
    private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
        // deletes row from table
        String dName = JOptionPane.showInputDialog("Enter");
        DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
    
       int rows = jTable1.getRowCount();
    
       for(int i = 0; i <= rows;i++){
            String hold = jTable1.getValueAt(i, 0).toString();
            if(hold.equals(dName)){
                model.removeRow(i);
            }
            break;
    
       }
    }