2013-02-27 23 views
1

我發現了類似的主題和閱讀: Java: Selected rows's index does not changes when sorted的TableModel convertRowIndex

How to Keep Track of row index when JTable has been sorted by the user?

我用三個表並在相關的海誓山盟

客戶 .KUNDENNUMMER = 過程 .KUNDENNUMMER PROCESS .ID = VORGANG_AUGENPAAR .VORGANG_ID

首先我選擇我的「主表」的客戶,那麼「詳細信息表」顯示我的所有從操作行至該客戶= OK。 (主表=全部細節表=進程列表) 現在我的子表顯示我所有的VORGANG_AUGENPAAR行到這個過程= OK

但我有一個邏輯的麻煩,如果我想插入新行到子表。表格「detailTable」中的PROG.ID。在我的detailTable中,PROCESS.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_correct身份證號碼」

在下一步中,我嘗試了詳細tableIndex行轉換爲正確的「operationList」模型。但也有一些是錯誤的:

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

與上面的代碼,我得到這樣的結果:「opticanuova.Vorgang [ID = 450] _wrong值」

我做了一些錯誤的轉換細節表的索引來處理列表索引。所以請給我的建議。我也嘗試了用於測試的索引號下面的代碼:

  //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"); 

但我總是得到詳細信息表的索引號,而不是進程列表。


更詳細的例子: 我試圖做的答案。 現在這裏是我的代碼:

//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 

你看,我已經有些不對勁。我需要有相同的值存儲在「SelectedObject」在我的「匹配」變量(700應該是ID = 700,而不是ID = 450)。所以請給我進一步的幫助。此致

+0

你還是沒有說什麼vorgangList。這是支持你的模型的列表嗎?如果是這樣,列表的索引與模型中的索引相同。所以你需要'opticanuova.task.Vorgang match = vorgangList.get(selectedRowIndexInModel);'。正如我已經說過的,selectedRowIndexInModel已經是模型中的一個索引。所以將它轉換爲模型沒有意義:'detailTable.convertRowIndexToModel(selectedRowIndexInModel)'根本沒有意義。 – 2013-02-28 11:05:39

+0

嗨,vorgangList存儲了表格Vorgang中的所有條目。 jTable「detailTable」通過customernumber過濾表Vorgang。所以在「detailTable」中是一個過濾的表格。這是vorgangQuery + List的代碼vorgangQuery = java.beans.Beans.isDesignTime()? null:entityManager.createQuery(「SELECT v FROM Vorgang v」); vorgangList = java.beans.Beans.isDesignTime()? java.util.Collections.emptyList():vorgangQuery.getResultList();' – birtprofi 2013-03-04 15:13:18

+0

對不起,但如果我添加註釋Formating不見了。通過以下代碼:「opticanuova.task.Vorgang match = vorgangList.get(selectedRowIndexInModel);」我也得到了錯誤的價值。這是匹配的結果:「opticanuova.Vorgang [id = 550] =匹配」。它是vorgangList和detailTable的索引#3。但是對於正確的值,detailTable中的索引#3必須是vorgangList中的索引#4。是否有可能在vorgangList中搜索正確的ID號,然後找到正確的索引號? – birtprofi 2013-03-04 15:30:10

回答

0

現在我已經找到了我的問題,正確的解決方案。有必要讓我的vorgangList循環拋出比較選定的值(ID),並找到正確的索引號。
//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)); }

感謝你的努力

0

JTable.getSelectedRow()返回所選擇的行的視圖索引。這bedeutet,如果您排列表格,然後選擇表格中所顯示的第一行DASS,你會得到0。但由於該表進行排序,該指數是不是選定行的模型索引。要獲取模型中的相應行,您必須致電JTable.convertRowIndexToModel()

所以,正確的順序來獲得詳細表中選擇的對象的ID是:

int selectedRowIndexInView = detailTable.getSelectedRow(); 
int selectedRowIndexInModel = detailTable.convertRowIndexToModel(); 
int idColumnIndex = 2; 
int selectedObject = 
    (int) detailTable.getModel().getValueAt(selectedRowIndexInModel, 
              idColumnIndex); 
+0

嗨,是的,這個序列或我上面的序列得到正確的ID。但我的問題到底是這樣的://這是錯誤的 opticanuova.task.Vorgang vor = vorgangList.get(detailTable.convertRowIndexToModel(selectedRowIndexInModel)); System.out.println(vor +「get wrong ID Number」);因爲有了這個腳本,我得到:opticanuova.Vorgang [id = 500]得到錯誤的ID號碼。正確的ID號碼例如700.和我上面的腳本獲得的ID 700 – birtprofi 2013-02-27 13:15:09

+0

我猜爲什麼我在「selectedRowIndexinView」和「selectedRowIndexInModel」中得到相同的索引號? – birtprofi 2013-02-27 13:21:56

+0

你的代碼沒有意義。您在模型中有一個索引,並使用'convertRowIndexToModel()'將其轉換。它已經是模型中的索引,所以您不能再次進行轉換。我假設vorgangList是支持你模型的列表。要從列表中獲取元素,只需使用'vorgangList.get(selectedRowIndexInModel)',其中'selectedRowIndexInModel'被初始化,如我的答案中所示。 – 2013-02-27 13:25:42