我创建了一个表和一些删除/添加行的按钮。 问题是,当我添加一个新行时,我必须在字段名称中插入一个值,该值不在该表中。让我解释一下。
这是默认表:
现在假设我删除了第3站:
如果我添加一个新的电台,我想添加一个新的电台名称Station 3(列表中缺少)但我添加了一个新的电台5(显然我的代码不正确)。
我的添加按钮操作事件的代码是这样的:
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”,以便我可以重新添加它?
提前感谢您的回答。
答案 0 :(得分:2)
只要你有
"Station " + (jTable1.getRowCount()+1)
新电台总是被命名为#34;电台N + 1&#34;。
假设您解决了在另一个答案所描述的空间上拆分的问题,那么您的代码应该类似于
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});
}
}
答案 1 :(得分:2)
由于“Station 1”中有空格,因此空间拆分不行。而是使用其他分隔符,例如“;”,最好使用Set<String> values = new HashSet<String>()
。
答案 2 :(得分: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});
答案 3 :(得分: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.
答案 4 :(得分:0)
这一行是问题
model.insertRow(jTable1.getRowCount(),new Object[] {jTable1.getRowCount() + 1,"Station " + (jTable1.getRowCount()+1),10,false,0,Color.BLACK});
您总是在rowCount() + 1
的行中添加。因此,即使您删除了Station 3,也有4行,并且您要添加行+ 1。
答案 5 :(得分:0)
此代码无效:
for (int i=0; i<tb1rows;i++) {
s2.concat(jTable1.getValueAt(i,1).toString());
s2.concat(" ");
}
在循环退出时,s2
仍然是一个空字符串,因此s3
将是一个空数组。
但是,无论如何,连接字符串然后拆分它们的方法是错误的。如果你需要的只是找到最小的整数,附加到“Station
”将产生一个唯一的字符串,最自然的方法是使你自己的TableModel
使用你自己的对象列表行的数据。在该数据中,您将保留整数本身,而不是整个字符串“Station n ”。然后在整数列表中找到一个漏洞将是一件微不足道的事。