0

我创建了一个表格和一些按钮来删除/添加行。问题是,当我添加新行时,我必须在字段名称中插入一个值,该值尚未出现在该表中。让我解释。

这是默认表:

11

现在想象我删除了第 3 站:

22

如果我添加一个新站,我想添加一个新站名称站 3(列表中缺少),但我正在添加一个新站 5(显然因为我的代码不正确)。

33

添加按钮操作事件的代码如下:

private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) {                                          
    DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
    String s2 = "";
    String s1 = "Station 1 Station 2 Station 3 Station 4 Station 5";
    int tb1rows = jTable1.getRowCount();
    if (tb1rows == 5) {
        // ERROR - MAXIMUM STATION NUMBER
    }
    else {
        for (int i=0; i<tb1rows;i++) {
            s2.concat(jTable1.getValueAt(i,1).toString());
            s2.concat(" ");
         }
        String[] s3=s2.split(" ");
        for (int i=0;i<s3.length;i++) {
            if (s1.contains(s3[i])) {
                System.err.println("contains");
                System.out.println(s3[i]);
            }
        }
        model.insertRow(jTable1.getRowCount(),new Object[] {jTable1.getRowCount() + 1,"Station " + (jTable1.getRowCount()+1),10,false,0,Color.BLACK});
    }
}

我的逻辑有什么问题?有没有更好的方法来处理这个问题,以便我可以获得该列中缺少的“Station x”,以便我可以重新添加它?

提前感谢您的回答。

4

6 回答 6

2

只要你有

"Station " + (jTable1.getRowCount()+1)

新站将始终命名为“Station N + 1”。

假设您解决了在另一个答案描述的空间上拆分的问题,您的代码应该类似于

 for (int i=0;i<s3.length;i++) {
            if (s1.contains(s3[i])) {
                System.err.println("contains");
                System.out.println(s3[i]);
            }
            else {
 model.insertRow(jTable1.getRowCount(),new Object[] {jTable1.getRowCount() + 1,"Station " + (i + 1)      ,10,false,0,Color.BLACK});
}

    }
于 2012-07-20T20:21:34.433 回答
2

由于“Station 1”中有一个空间,因此空间分割是不行的。而不是使用另一个分隔符,如“;”,最好使用Set<String> values = new HashSet<String>().

于 2012-07-20T20:21:44.307 回答
1

如果它已订购,您可以找到第一个间隙并插入那里。所以迭代行,如果nextrow.numberInIt > thisrow+1你插入thisrow+1


代码应该是这样的:

int nextNrToInsert;

for(int=0; i < tb1rows; i++){
    thisrowNr = jTable1.getValueAt(i,1).toString();
    NextrowNr = jTable1.getValueAt(i+1,1).toString();

    if(nextrowNr > thisrowNr+1){
      //found the gap
      nextNrToInsert = thisrowNr+1;
      break;
    }
}
//change this to use nextNrToInsert
model.insertRow(jTable1.getRowCount(),new Object[] {jTable1.getRowCount() + 1,"Station " + (jTable1.getRowCount()+1),10,false,0,Color.BLACK});
于 2012-07-20T20:26:37.847 回答
1

而不是所有的字符串操作,你可以使用 set mainpulations:

HashSet<String> all = new HashSet<String>();
// then populate all with your 5 station strings (loop)
HashSet<String> have = new HashSet<String>();
// then populate all with the contents of your table (loop)
all.removeAll(have);
// all now contains the ones that weren't in the table.
于 2012-07-20T20:26:50.950 回答
0

此代码无效:

    for (int i=0; i<tb1rows;i++) {
        s2.concat(jTable1.getValueAt(i,1).toString());
        s2.concat(" ");
     }

在循环退出时,s2仍然是一个空字符串,所以s3也是一个空数组。

但是,无论如何,连接字符串然后拆分它们的方法是错误的。如果您只需要找到附加到“ Station”将产生唯一字符串的最小整数,最自然的方法是制作您自己的方法TableModel,为每行数据使用您自己的对象列表。在该数据中,您将保留整数本身,而不是整个字符串“Station n ”。那么在整数列表中找到一个洞将是一件小事。

于 2012-07-20T21:00:54.837 回答
0

这条线是问题

model.insertRow(jTable1.getRowCount(),new Object[] {jTable1.getRowCount() + 1,"Station " + (jTable1.getRowCount()+1),10,false,0,Color.BLACK});

您总是在行中添加rowCount() + 1. 因此,即使您删除了第 3 站,也有 4 行,并且您正在添加第 1 行。

于 2012-07-20T20:24:20.843 回答