2013-02-27 51 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