처음부터 필요한 모든 데이터를 자신의 데이터 모델에로드하거나 자신의 목록을 구현하여 데이터 테이블에 사용할 수 있습니다. List는 기준에 따라 행 데이터를로드 할 수 있습니다. 예 :
public class MyList extends AbstractList<MyPageEntry> {
public static Logger log = Logger.getLogger(MyList.class.getName());
private int total = 0;
private int pageSize = 100;
private int pageNumber = 0;
private List<MyPage> pages = new ArrayList<MyPage>();
private final DBConnection connection;
public PageableDebugList(SpiderConnection connection, String sourcename, String debugFilterValue) {
super();
this.connection = connection;
fetchPage(0);
}
private synchronized void fetchPage(int pageNumber) {
int start = pageNumber * pageSize;
try {
// possibly add other criteria here
MyPage page = connection.getPage(start, pageSize,...);
while (pages.size() < pageNumber + 1) {
pages.add(null);
}
pages.set(pageNumber, page);
total = page.getTotalSize();
if (false) {
preFetchNext(pageNumber + 1, 1);
}
log.fine(page.getSize() + " " + total);
} catch (Exception ex) {
log.warning("Error fetching page - " + ex);
}
}
public void reset() {
pages = new ArrayList<Page>();
}
private boolean hasPage() {
return pages.size() >= pageNumber + 1 && pages.get(pageNumber) != null;
}
public boolean isRowAvailable(int rowIndex) {
if (!hasPage())
return false;
if (total > rowIndex && rowIndex >= 0)
return true;
else
return false;
}
@Override
public synchronized MyPageEntry get(int index) {
pageNumber = index/pageSize;
if (!hasPage()) {
try {
fetchPage(Math.abs(pageNumber));
} catch (Exception e) {
log.warning(e.toString());
}
}
int localIndex = index % pageSize;
if (isRowAvailable(index)) {
List<PageEntry> resultList = pages.get(pageNumber).getEntries();
if (localIndex < resultList.size()) {
MyPageEntry result = resultList.get(localIndex);
return result;
} else {
return null;
}
} else {
return null;
}
}
@Override
public int size() {
return total;
}
private void preFetchNext(final int start, final int count) {
Thread t = new Thread() {
@Override
public void run() {
for (int i = start; i < start + count; i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
log.warning(e.toString());
}
try {
fetchPage(i);
} catch (Exception e) {
log.warning(e.toString());
}
}
}
};
}
public int getPageNumber() {
return pageNumber;
}
public List<DebugLinkPage> getPages() {
return pages;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageSize() {
return pageSize;
}
}
이 경우 한 번에 전체 페이지가로드됩니다. 그러나 get() 메소드에서도 가져 오기를 수행하고 액세스 할 때 각 행을로드 할 수 있습니다.
실제로 "commandLink"에서 "action"과 같은 것을 찾으려고합니다. 각 행마다 작업이 필요하므로 내 자신의 사용자 지정 열 데이터를 표시 할 수 있습니다. – wasimbhalli