例如:
JTable 有1000条记录(row),在屏幕上只能显示100条,假设当前在第1行,然后点击next->JTable记录跳到第100行(该页末尾),再点击next->JTable记录跳到第101行(在该页第首条)?
请问如何实现?JTable有取类似显示中的数据吗?
JTable 有1000条记录(row),在屏幕上只能显示100条,假设当前在第1行,然后点击next->JTable记录跳到第100行(该页末尾),再点击next->JTable记录跳到第101行(在该页第首条)?
请问如何实现?JTable有取类似显示中的数据吗?
可能你误会我的意思了,并不是分几次把数据拷到模型;而是JTable已经有1000条数据了,只是屏幕上只能看到一部分(JScollPane),主要想解决取JTable正在显示的数据(row)?ps:自己猜想可能跟JScollPane有关而不是JTable??
HELP
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Vector;import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;public class PageTableModel extends AbstractTableModel implements TableModelListener {
private TableModel realModel = null;
private int pageSize = 10;
private int curPage = 0;
public PageTableModel(TableModel realModel, int pageSize) {
this.realModel = realModel;
this.pageSize = pageSize; this.realModel.addTableModelListener(this);
} public int getRowCount()
{
int realRowCount = realModel.getRowCount();
if (curPage == realRowCount / pageSize) {
return realRowCount % pageSize;
}
return pageSize;
} public int getColumnCount()
{
return realModel.getColumnCount();
}
public String getColumnName(int column)
{
return realModel.getColumnName(column);
}
public Class getColumnClass(int columnIndex)
{
return realModel.getColumnClass(columnIndex);
} public Object getValueAt(int rowIndex, int columnIndex)
{
int realRowIndex = curPage * pageSize + rowIndex;
return realModel.getValueAt(realRowIndex, columnIndex);
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{
int realRowIndex = curPage * pageSize + rowIndex;
realModel.setValueAt(aValue, realRowIndex, columnIndex);
} public void tableChanged(TableModelEvent e)
{
if (e.getFirstRow() == TableModelEvent.HEADER_ROW ||
e.getType() == TableModelEvent.DELETE ||
e.getType() == TableModelEvent.INSERT) {
fireTableStructureChanged();
return;
} int realRowCount = realModel.getRowCount(); int lastRow = e.getLastRow();
int firstRow = e.getFirstRow(); if (firstRow < curPage * pageSize) {
firstRow = curPage * pageSize;
}
if (lastRow > (curPage + 1) * pageSize) {
lastRow = (curPage + 1) * pageSize;
}
lastRow = lastRow % pageSize;
firstRow = firstRow % pageSize;
TableModelEvent ne = new TableModelEvent(this, firstRow, lastRow, e.getColumn(), e.getType());
fireTableChanged(ne);
}
public int getPageCount()
{
int realRowCount = realModel.getRowCount();
return realRowCount % pageSize == 0 ?
(realRowCount / pageSize) : (realRowCount / pageSize + 1);
}
public int getCurPage()
{
return curPage;
}
public void setCurPage(int curPage)
{
if (curPage < 0 || curPage >= getPageCount()) {
return;
}
this.curPage = curPage;
fireTableDataChanged();
} public static void main(String[] args)
{
TableModel model = createTableModel();
final PageTableModel pageModel = new PageTableModel(model, 97);
JTable table1 = new JTable(model);
JTable table2 = new JTable(pageModel);
JScrollPane sp1 = new JScrollPane(table1);
JScrollPane sp2 = new JScrollPane(table2); JButton prevPageBtn = new JButton("PreviousPage");
JButton nextPageBtn = new JButton("NextPage");
JPanel p2 = new JPanel();
p2.add(prevPageBtn);
p2.add(nextPageBtn);
prevPageBtn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int curPage = pageModel.getCurPage();
pageModel.setCurPage(curPage - 1);
}
});
nextPageBtn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int curPage = pageModel.getCurPage();
pageModel.setCurPage(curPage + 1);
}
});
JPanel p = new JPanel(new GridLayout(1, 2, 10, 0));
p.add(sp1);
p.add(sp2);
JFrame f = new JFrame();
f.getContentPane().add(p, BorderLayout.CENTER);
f.getContentPane().add(p2, BorderLayout.SOUTH);
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true); } private static TableModel createTableModel()
{
String[] columnNames = new String[] {"Column1", "Column2", "Column3", "Column4"};
Vector data = new Vector();
for (int i = 0; i < 1000; i++) {
Vector row = new Vector();
data.add(row);
for (int k = 0; k < 4; k++) {
row.add("Cell(" + (i+1) + "," + (k+1) + ")");
}
}
Vector colNames = new Vector();
colNames.addAll(Arrays.asList(columnNames));
DefaultTableModel model = new DefaultTableModel(
data, colNames);
return model;
}
}
因为表模型我已经写好了,所以不想再做太大的改动,最好是JTable或者是ColumnModel自带的...
这个nextPage功能只能先放一放了,目前正在做表的默认行的功能--烦!
ps:最恨表的锁定,先前做的功能全白费了。 AND 表的绘制器真是变态