【问题标题】:TableModel convertRowIndex表模型转换行索引
【发布时间】:2013-02-27 08:23:02
【问题描述】:

我发现了类似的主题并阅读了以下内容: Java: Selected rows's index does not changes when sorted

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

我使用三个相互关联的表

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

首先我在“masterTable”中选择我的客户,然后“detailTable”显示从 VORGANG 到该客户的所有行 = OK。 (masterTable = 列表,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_correct ID Number”

在下一步中,我尝试将 detailTable 索引 Row 转换为正确的“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" );

但我总是得到 detailTable 的索引号,而不是 vorgangList 的索引号。


更详细的例子: 我试着做答案。 这是我的代码:

    //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)。所以请给我进一步的帮助。最好的问候

【问题讨论】:

  • 你还没说 vorgangList 是什么。是支持您的模型的列表吗?如果是这样,则列表的索引与模型中的索引相同。所以你需要opticanuova.task.Vorgang match = vorgangList.get(selectedRowIndexInModel);。正如我已经说过的, selectedRowIndexInModel 已经是模型中的索引。所以将其转换为模型是没有意义的:detailTable.convertRowIndexToModel(selectedRowIndexInModel) 根本没有意义。
  • 您好,vorgangList 存储了 Table my table Vorgang 中的所有条目。 jTable "detailTable" 按客户编号过滤表 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();`
  • 对不起,如果我添加评论,格式就消失了。使用此代码:“opticanuova.task.Vorgang match = vorgangList.get(selectedRowIndexInModel);”我也得到了错误的值。这是匹配的结果:“opticanuova.Vorgang[id=550] = match”。它是 vorgangList 和 detailTable 的索引 #3。但是对于正确的值,detailTable 中的索引#3 必须是 vorgangList 中的索引#4。是否可以在 vorgangList 中搜索正确的 ID 号,然后找到正确的索引号?

标签: java swing jtable tablemodel


【解决方案1】:

JTable.getSelectedRow() 返回所选行的 view 索引。这意味着如果您对表格进行排序,然后选择表格中显示的第一行,您将获得0。但是由于表格是排序的,所以这个索引不是 model 中所选行的索引。要获取模型中对应的行,必须调用JTable.convertRowIndexToModel()

所以,获取明细表中所选对象的ID的正确顺序是:

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

【讨论】:

  • 嗨,是的,这个序列或我上面的序列得到了正确的 ID。但我的问题是这样的: //这是错误的 opticanuova.task.Vorgang vor = vorgangList.get(detailTable.convertRowIndexToModel(selectedRowIndexInModel)); System.out.println( vor + "得到错误的 ID 号" );因为有了这个脚本,我得到: opticanuova.Vorgang[ id=500 ]get wrong ID Number。正确的 ID 号码,例如700. 我在上面的脚本中得到的 ID 700
  • 我猜为什么我在“selectedRowIndexinView”和“selectedRowIndexInModel”中得到相同的索引号?
  • 你的代码没有意义。您在模型中有一个索引,您可以使用convertRowIndexToModel() 对其进行转换。它已经是模型中的一个索引,所以你不能再次转换它。我假设 vorgangList 是支持您的模型的列表。要从此列表中获取元素,只需使用vorgangList.get(selectedRowIndexInModel),其中selectedRowIndexInModel 已初始化,如我的答案所示。
  • 好的,如果表格已排序,它就可以工作。但是我的“detailTable”被过滤了。这取决于“masterTable”的选定值。所以“detailTable”只包含具有相同客户编号的值,但我的“vorgangList”模型包含所有数据集。所以我必须在“vorgangList”中找到正确的索引号
  • 对不起,我是 java 新手。你的意思是:opticanuova.task.Vorgang vor = vorgangList.get(selectedRowIndexInModel);?有了这个我得到以下信息: opticanuova.Vorgang[ id=450 ]get wrong ID Number
【解决方案2】:

现在我找到了解决问题的正确方法。需要循环抛出我的 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)); }

感谢您的努力

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2016-03-28
    • 2021-08-28
    • 2017-07-23
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多