-1

我正在使用 aJTable并通过 CTRL+A 选择所有行。我得到了正确的选定行,但是当我试图获取值时,它只给出视口中的值。

我在这里添加了我的代码的一部分。

JTable _resultTable = new JTable();
JScrollPane _resultPane = new JScrollPane();

_resultTable.setModel(JUTableBindingFactory.createAttributeListBinding(_panelBinding, _resultTable , _searchViewName, _searchViewName + "Iter", _searchViewName + "IterBinding", FIELDS));
_resultPane.getViewport().add(_resultTable);
MultiSelectionListListener.setMultiSelectionModel(_resultTable);

_changeSelectedButton.addActionListener(new ActionListener()
{
  public void actionPerformed(ActionEvent e)
  {
    int[] tableRows = _resultTable.getSelectedRows();

    System.out.println(" length :" + tableRows.length);

    Row[] dataRows = new Row[tableRows.length];

    RowIterator iterator = null;
    JUIteratorBinding iterBinding = _panelBinding.getRowIterBinding(_searchViewName, _searchViewName + "Iter",_searchViewName.replace('.','_')+"IterBinding");
    iterator = iterBinding != null ? iterBinding.getNavigatableRowIterator() : null;

    for (int i = 0; i < tableRows.length; i++)
    {
      dataRows[i] = iterator.getRowAtRangeIndex(rowIndexToRangeIndex(tableRows[i], iterator));
      System.out.println(" Name :" + i + " " +dataRows[i].getAttribute(1));
    }
  }

从上面的代码片段中,如果存在的记录数是 50,我们可以看到 10 条记录,那么输出是:

长度:50

姓名:0 纳丁

姓名 : 1 Nadine1

名称 : 2 Nadine23

名称 : 3 Nadine3

名称 : 4 Nadine4

姓名 : 5 Nadine5

姓名 : 6 Nadine6

姓名 : 7 Nadine7

名称 : 8 Nadine8

姓名 : 9 Nadine9

名称 : 10 Nadine10

在打印 10 条记录后,它会NullPointerExpetiondataRows[i].getAttribute(1).

这意味着它不会为不在视口上的记录挑选数据。

那么解决方案可能是什么?

编辑 我正在使用 BC4J 绑定来获取表中的数据。

4

2 回答 2

2

您的代码段建议的一些事情:

  • 不要混合模型和视图坐标,根据需要进行转换

  • 访问您的TableModel,而不是用于构造它的数据结构。

于 2013-08-05T11:49:04.903 回答
0

我已经在互联网上搜索了这个问题,并找到了一个可以帮助我理解这个问题的链接。未加载数据,因为绑定加载了需要在视口上显示的大量数据。因此,在尝试访问不在视口上的数据时会出错。

为了解决这个问题,我们只需要通过稍微调整绑定来加载 View Object 中的所有数据。

 JUIteratorBinding iterBinding = _panelBinding.getRowIterBinding(_searchViewName, _searchViewName + "Iter",_searchViewName.replace('.','_')+"IterBinding");

DCIteratorBinding iterBinding = _panelBinding.getIteratorBinding(_searchViewName, _searchViewName + "Iter",_searchViewName.replace('.','_')+"IterBinding", -1);

最后一个参数-1用于 setRangeSize(-1),它将加载所有数据。

于 2013-08-12T10:17:57.547 回答