我正在使用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绑定来获取表中的数据。
答案 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),它将加载所有数据。