JTable不返回所有记录的数据

时间:2013-08-05 11:24:42

标签: java swing jtable

我正在使用JTable并按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 Nadine

姓名:1 Nadine1

姓名:2 Nadine23

姓名:3 Nadine3

姓名:4 Nadine4

姓名:5 Nadine5

姓名:6 Nadine6

姓名:7 Nadine7

姓名:8 Nadine8

姓名:9 Nadine9

姓名:10 Nadine10

在打印10条记录后,它会在NullPointerExpetion处提供dataRows[i].getAttribute(1)

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

那么解决方案是什么?

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

2 个答案:

答案 0 :(得分:2)

您的代码段建议的一些内容:

  • 请勿根据需要混合模型和视图坐标,convert

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

答案 1 :(得分:0)

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

要解决这个问题,我们只需稍微调整绑定就可以加载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),它将加载所有数据。