1

私は同様のトピックを見つけてこれを読みました: Java:選択された行のインデックスはソートされても変更されません

JTableがユーザーによってソートされたときに行インデックスを追跡する方法は?

相互に相関している3つのテーブルを使用します

KUNDE .KUNDENNUMMER = VORGANG .KUNDENNUMMER VORGANG .ID = VORGANG_AUGENPAAR .VORGANG_ID

最初に「masterTable」で顧客を選択し、次に「detailTable」にVORGANGからこの顧客までのすべての行が表示されます=OK。(masterTable = list、detailTable = vorgangList)これで、subTableに、VORGANG_AUGENPAARからこのVORGANG=OKまでのすべての行が表示されます。

しかし、subTableに新しい行を挿入したい場合は、論理的な問題があります。挿入の場合、テーブル「detailTable」から正しいVORGANG.IDを取得する必要があります。私のdetailTableでは、VORGANG.IDが正しい方法で出力されます。

次のコードで正しいIDを取得します:

    int selectedRowIndex = detailTable.getSelectedRow();
    int selectedColumnIndex = 2;
    //get the correct ID:
    int selectedObject = (int) detailTable.getModel().getValueAt(selectedRowIndex, selectedColumnIndex);
    System.out.println( selectedObject + "_correct ID Number" );

次に、次の結果が得られます:「700_correctIDNumber」

次のステップでは、detailTableインデックスの行を正しい「vorgangList」モデルに変換しようとします。しかし、何か問題があります。

    //this is wrong
    opticanuova.task.Vorgang vor  = vorgangList.get( detailTable.convertRowIndexToModel(selectedRowIndex));
    System.out.println( vor + "_wrong value" );

上記のコードを使用すると、次の結果が得られます: "opticanuova.Vorgang [id = 450] _wrong value"

detailTableインデックスをvorgangListインデックスに変換するのに何か問題がありました。だから私にあなたのアドバイスをください。また、インデックス番号をテストするために次のコードを試しました。

            //testing vor index value
    int test2 = (int) detailTable.convertRowIndexToView(selectedRowIndex);
    System.out.println( test2 + "IndexConverted_ToView_test2" );
    int convertedRowAtPoint = detailTable.convertRowIndexToModel(selectedRowIndex);
    System.out.println( convertedRowAtPoint + "IndexConverted_ToModel: false mapped Row" );

しかし、私は常にvorgangListではなくdetailTableのインデックス番号を取得します。


例でより詳細に:私は答えをしようとしました。これが私のコードです:

    //this sequence get the correct ID:
    int selectedRowIndexInView = detailTable.getSelectedRow();
    int selectedRowIndexInModel = detailTable.convertRowIndexToModel(selectedRowIndexInView);    
    int idColumnIndex = 2;
    int selectedObject = (int) detailTable.getModel().getValueAt(selectedRowIndexInModel, idColumnIndex);
    //this is wrong
    opticanuova.task.Vorgang match  = vorgangList.get(detailTable.convertRowIndexToModel(selectedRowIndexInModel));
    //print out:
    System.out.println( selectedRowIndexInView  + " = selectedRowIndexInView " );
    System.out.println( selectedRowIndexInModel  + " = selectedRowIndexInModel " );
    System.out.println( selectedObject + " = selectedObject" );
    System.out.println( vorgangList + " = vorgangLIst" );
    System.out.println( match + " = match" );

結果は次のとおりです。

1 = selectedRowIndexInView 
1 = selectedRowIndexInModel 
700 = selectedObject
[opticanuova.Vorgang[ id=400 ], opticanuova.Vorgang[ id=450 ], opticanuova.Vorgang[ id=550 ], opticanuova.Vorgang[ id=600 ], opticanuova.Vorgang[ id=650 ], opticanuova.Vorgang[ id=700 ]] = vorgangLIst
opticanuova.Vorgang[ id=450 ] = match

ほら、私はすでに何かがおかしい。「match」変数の「selectedObject」に格納されているのと同じ値が必要です(700はid=450ではなくid=700である必要があります)。だから私はさらに助けてください。よろしくお願いします

4

2 に答える 2

0

JTable.getSelectedRow()選択した行のビューインデックスを返します。つまり、テーブルを並べ替えてから、テーブルに表示されている最初の行を選択すると、が表示されます0。ただし、テーブルは並べ替えられているため、このインデックスはモデルで選択された行のインデックスではありません。モデル内の対応する行を取得するには、を呼び出す必要がありますJTable.convertRowIndexToModel()

したがって、詳細テーブルで選択されたオブジェクトのIDを取得するための正しいシーケンスは次のとおりです。

int selectedRowIndexInView = detailTable.getSelectedRow();
int selectedRowIndexInModel = detailTable.convertRowIndexToModel();
int idColumnIndex = 2;
int selectedObject = 
    (int) detailTable.getModel().getValueAt(selectedRowIndexInModel, 
                                            idColumnIndex);
于 2013-02-27T09:09:39.000 に答える
0

今、私は自分の問題の正しい解決策を見つけました。選択した値(ID)を比較し、正しいインデックス番号を見つけるために、ループでvorgangListをスローする必要がありました。
//find selected value
int selectedObject = (int) detailTable.getModel().getValueAt(selectedRowIndexInModel, idColumnIndex);
//find ID:
for(int i = 0; i < vorgangList.size(); i++) {
Vorgang vorgangs = vorgangList.get(i);
if (vorgangs.getId().equals(selectedObject) == true) {
System.out.println(vorgangs.getId() + " getId " + vorgangList.get(i)); }

あなたの努力に感謝します

于 2013-03-05T07:53:18.070 に答える