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});
    }
}

私のロジックの何が問題になっていますか?その列にない「ステーションx」を取得して再度追加できるように、問題を処理するためのより良い方法はありますか?

よろしくお願いします。

4

6 に答える 6

2

あなたが持っている限り

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

新しいステーションは常に「ステーション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

「ステーション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

すべての文字列操作の代わりに、setmainpulationsを使用できます。

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

この行が問題です

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 に答える
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 に答える