TWaver Java不但提供了TTable、TElementTable这些表格组件,而且还提供了表格翻页器TPageNavigator。让表格和翻页器结合工作,可以立刻做出一个非常标准的可翻页的表格界面,如下图。

要让这两个组件一起工作,直接这样new一个实例,并放在界面上就可以了:

TElementTable table = new TElementTable();

int[] pageSizes = { 100, 500, 1000 };

TPageNavigator nav=new TPageNavigator(table.getTablePaging(), pageSizes)

其中nav就是一个普通的JPanel,可以放在界面的任何位置。而table可以和nav在界面上完全脱离显示,如何布局都可以。

不过,这个可以翻页的表格,只能翻页本地数据。也就是说,它只能翻已经放入TDataBox中的数据。例如我们一次性在TDataBox中加入了10000条数据,可以通过这个翻页器进行“每页100条、共有100页”这样的翻页操作。但是大多时候,我们需要的并不是“本地翻页”,而是“远程翻页”。所谓的远程翻页,也就是在每次翻页时候,TDataBox的数据需要被清空,并从远程服务器动态重新获取“下一页”的数据进行TDataBox加载并且显示。

如何做到这一点呢?只要用了TWaver Java这一“神器”,做到这一点就不难了。本文就通过一个例子,来说明如何定制一个翻页器,来拦截翻页动作,并从服务器获取翻页数据,进行动态显示。

TElementTable的翻页,实际上是靠一个TablePaging的接口来完成的。TWaver Java靠一个默认的TablePaging实现来完成了本地翻页。而我们要做的,就是创建一个远程翻页的TablePaging,来代替这个默认实现即可。

TablePaging接口定义了下面这些函数。大多数的函数,都是在问你一些简单的远端数据方面的问题:一共有多少记录?一页有多少条记录?一共有多少页?当前是第几页?并且在第一页、最后一页、上一页、下一页等操作发生时,回调这个接口。所以,我们只要有了后台数据,就不难回答这些问题。

public interface TablePaging {

public int getCurrentPageIndex();

public void setCurrentPageIndex(int currentPageIndex);

public int getPageRowSize();

public void setPageRowSize(int pageRowSize);

public int getPageTotalCount();

public int getTotalRowCount();

public void firstPage();

public void previousPage();

public void nextPage();

public void lastPage();

public void update();

public void addPageListener(PageListener pageListener);

public void removePageListener(PageListener pageListener);

}

以上函数基本上都可以顾名思义地理解,就不多作介绍了。我们现在假设后台有一个数据库,里面有一个客户地址的table。通过一个SQL查询服务,我们可以获得这些翻页数据。根据这个假设,我们可以做下面的实现:

public class AddressTablePaging implements TablePaging {

private SearchPane parent = null;

private List pageListeners = new ArrayList();

private TElementTable table = null;

private int pageIndex = 1;

private int pageSize = 100;

public AddressTablePaging(TElementTable table, SearchPane parent) {

this.table = table;

this.parent = parent;

}

private void loadPage() {

table.getDataBox().clear();

try {

int start = (pageIndex - 1) * pageSize;

Collection data = Server.searchAddress(.....);

for (AddressVO vo : data) {

Node node = new Node();

node.setBusinessObject(vo);

table.getDataBox().addElement(node);

}

} catch (Exception ex) {

ex.printStackTrace();

JOptionPane.showMessageDialog(table, ex.getMessage());

}

firePageChanged();

}

@Override

public void firstPage() {

pageIndex = 1;

loadPage();

}

@Override

public int getCurrentPageIndex() {

return this.pageIndex;

}

@Override

public int getPageRowSize() {

return this.pageSize;

}

@Override

public int getPageTotalCount() {

try {

int totalCount = getTotalRowCount();

int pageCount = totalCount / getPageRowSize();

if (totalCount % getPageRowSize() > 0) {

pageCount++;

}

return pageCount;

} catch (Exception ex) {

ex.printStackTrace();

}

return 0;

}

@Override

public int getTotalRowCount() {

try {

return Server.getAddressTotalCount(....);

} catch (Exception ex) {

ex.printStackTrace();

}

return 0;

}

@Override

public void lastPage() {

this.pageIndex = getPageTotalCount();

this.loadPage();

}

@Override

public void nextPage() {

this.pageIndex++;

this.loadPage();

}

@Override

public void previousPage() {

if (this.pageIndex > 1) {

pageIndex--;

}

this.loadPage();

}

@Override

public void setCurrentPageIndex(int pageIndex) {

this.pageIndex = pageIndex;

}

@Override

public void setPageRowSize(int pageSize) {

this.pageSize = pageSize;

}

@Override

public void addPageListener(PageListener pageListener) {

this.pageListeners.add(pageListener);

}

@Override

public void removePageListener(PageListener pageListener) {

this.pageListeners.remove(pageListener);

}

public void firePageChanged() {

for (int i = 0; i < this.pageListeners.size(); i++) {

PageListener pageListener = (PageListener) this.pageListeners.get(i);

pageListener.pageChanged();

}

}

@Override

public void update() {

}

}

在上面代码中,所有的翻页函数,都会集中调用loadPage()这个函数,从后台真正获取数据。而函数getTotalRowCount则负责从后台获得“一共有多少条记录”。其他函数,基本进行转发即可。

另外一个需要注意的就是removePageListener/addPageListener等函数。主要用于对监听器进行管理,包括注册、删除、触发通知等等。这些也是必须要实现的,不过很简单,用一个ArrayList维护就行了,触发时间时候,直接遍历、回调即可。

具体通过SQL从后台调用数据的实现,这里就不介绍了。相信每一个实际项目都有不同的数据库、接口、调用方法方面的差别。这里只是点到为止。

有了这个翻页器,我们就可以直接用在表格中了。下面继承一个表格,并用这个翻页器。

public class AddressTable extends TElementTable {

...

public AddressTablePaging getTablePaging() {

return tablePaging;

}

...

}

这样,默认翻页器被替换,新的后台翻页器被置入表格中。最后,再通过本文最开始提供的两行代码把表格放入界面中,程序就基本完成了。

int[] pageSizes = { 100, 500, 1000 };

this.add(new TPageNavigator(table.getTablePaging(), pageSizes), BorderLayout.CENTER);

其中pageSizes数组是定义了界面上每页条数的下拉列表选项,我们可以根据实际应用自己设置,如下图:

这样,一个完整的后台翻页程序就完成了。给表格设置好列、在后台添加一些数据,跑起来会是这样:

如果再增加一些查询字段等,就更帅了: 对了,最后,再顺便给大家介绍一下表格中的可点击连接是如何做的:

要做这种可点击链接,首先要做3件事:1是显示link,2是显示手形状的光标,3是响应鼠标点击动作。对于1,可以来个“釜底抽薪”:在表格上从根儿上拦截prepareRenderer然后对文字动态修改为html的a标签的连接方式进行处理:

@Override

public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {

Element element = this.getElementByRowIndex(row);

AddressVO vo = (AddressVO) element.getBusinessObject();

Component com = super.prepareRenderer(renderer, row, column);

if (!vo.isValid()) {

com.setForeground(Color.red);

} else {

com.setForeground(Color.black);

}

if (column == 2 || column == 3) {

String text = ((JLabel) com).getText();

text = "" + text + "";

((JLabel) com).setText(text);

}

return com;

}

对于手形光标,可以通过监听鼠标移动,是否位于链接文字上方来动态修改光标:

this.addMouseMotionListener(new MouseMotionAdapter() {

@Override

public void mouseMoved(MouseEvent e) {

int row = rowAtPoint(e.getPoint());

int column = columnAtPoint(e.getPoint());

setCursor(Cursor.getDefaultCursor());

if (row >= 0 && column >= 0) {

if (column == 2 || column == 3) {

setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

}

}

}

});

最后,对于点击动作,可以通过给table添加鼠标监听器完成:

this.addMouseListener(new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent e) {

int row = rowAtPoint(e.getPoint());

int column = columnAtPoint(e.getPoint());

setCursor(Cursor.getDefaultCursor());

if (row >= 0 && column >= 0) {

if (column == 2 || column == 3) {

Object value = getValueAt(row, column);

//do your action here.

}

}

}

});

至此,一个完整的可后台翻页、可鼠标点击超链接的综合型table就完成了。在实际使用中,还可以增加更复杂的翻页和显示效果。例如在TWaver的兄弟产品2BizBox免费ERP软件中,就有大量这样的应用,感兴趣的朋友可以到2BizBox.cn去下载安装一个玩一玩。

java swing表格翻页_让Swing表格支持远程后台数据翻页相关推荐

  1. 让Swing表格支持远程后台数据翻页

    TWaver Java不但提供了TTable.TElementTable这些表格组件,而且还提供了表格翻页器TPageNavigator.让表格和翻页器结合工作,可以立刻做出一个非常标准的可翻页的表格 ...

  2. word表格分开快捷键_在Word 表格的编辑中,快速拆分表格应按快捷键为______。

    [单选题]在Word文档中,如果要指定每页中的行数,可以通过_____进行设置. [简答题]要求把任务点的所有课程笔记都上传,拍照上传. [单选题]在Word文档中,有一个段落的最后一行只有一个字符, ...

  3. php后台数据显示到前端,php,前端_怎么在javascript中得到后台数据?,php,前端,javascript,highcharts - phpStudy...

    怎么在javascript中得到后台数据? 最近在研究在网页中嵌入hightchart的表格 在嵌入时发现需要在javascript中得到后台的一组数据 代码如下 require_once('incl ...

  4. html漂亮的表格模板+背景_教育与课程主题响应式网站着陆页模板

    哈喽!大家好,这里公众号,Adobe素材助手. 教育与课程主题响应式网站着陆页模板.它是一个干净.现代和创造性的设计适合所有类型的教育风格的网站.这个教育网站模板是创造性和专业性的完美结合,所有部分都 ...

  5. html漂亮的表格模板+背景_咨询amp;金融主题响应式网站着陆页模板

    哈喽!大家好,这里公众号,Adobe素材助手. 这是针对咨询和金融网站的响应式网站着陆页模板.它是一个干净,现代和创造性的设计适合所有类型的咨询式网站.这个金融网站模板是创造性和专业性的完美结合,所有 ...

  6. word表格分开快捷键_在Word2010表格的编辑中,快速的拆分表格应按()快捷键。

    中快我国6年年均增长粮食率为. 表编辑表格 拆分不能被9的自的和整除0各然数数中所有是(. 应按比为电针单纯的患型慢性支息型慢性患者好转用脊炎好与用治疗转的针治支气者人脊电气管管炎人数疗喘数之. 蘑菇 ...

  7. java程序ssh置顶_使用shell脚本启动远程(SSH)Java应用程序不会返回本地提示

    我见过类似的问题,所有已解决的问题已经解决/不适用. 我在启动Java应用程序的远程计算机中有一个bash脚本.相关的行将是: #!/usr/bin/env bash ... java -cp /fu ...

  8. element表格图片放大_图片在表格中,鼠标经过图片上方,图片有放大预览效果 (vue+element )...

    element的鼠标移到图片时,放大预览效果.实现思路:element的 el-table + el-popover export default { data () { return { tabDa ...

  9. dw2020表格不可见_【分享表格模板】手把手教你算小目标实际本金和综合年化收益率...

    By@阿常哟我在帖子快车真的太给力了!里分享过一次小目标投资收益的计算表格,当时在综合年化收益率的计算上有一点错误,我是粗暴地将单期的年化收益率累加.得出的数字大得惊人也不符合实际情况,所以我这次更新 ...

最新文章

  1. python之matplotlib制作雷达图
  2. 数据治理(Data Governance)
  3. WMS(一):Window的添加过程
  4. 图像识别工程师 VS The application has requested the Runtime to terminate it in an unusual way.
  5. [转载]ArcMap中如何自制符号库(二)
  6. Policy-based RL小结(Policy Gradient ; Natural policy gradient ;TRPO;ACKTR;PPO )
  7. spark SQL Running the Thrift JDBC/ODBC server
  8. 北邮计算机学不学单片机,北邮小学期PC单片机.docx
  9. 关于C编程的一点感受
  10. 算法工程师,『工程』二字怎么破?
  11. 硬编码是什么意思_饰品上那些编码和数字你都知道是什么意思吗?
  12. 学会阅读英文计算机原著
  13. python写的监视bt.ktxp.com的rss的小脚本 updated
  14. SHELL中获取函数返回值
  15. 计算机怎么配置IP地址,如何设置电脑IP地址?
  16. Go reflect初探
  17. 阿里员工调侃:花名考拉的妹子离职去了网易考拉,现在又回来了
  18. python学习面向对象_Python小白必学的面向对象
  19. 十个Mac端设计软件
  20. 深度学习之NN(Neural Network)

热门文章

  1. 阿里巴巴年报来了,一天收入6.85亿
  2. html 的id指什么,appid是什么?
  3. Excel无法跨表筛选,也不能多列筛选,要如何突破限制呢?本教材有方法
  4. 致远项目管理SPM系统资源管理之资源台班工时管理
  5. 无损放大图片软件有什么?安利几款放大图片的软件
  6. huya弹幕提取小尝试
  7. 恐怕你确定自己喜欢做什么
  8. 最有效的赚钱方法,只有100元如何赚到10万?
  9. 源码分析学习记录(11)——半边结构
  10. UTF-8与unicode的故事(转自某位我没找到的大牛)