自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

讓Swing表格支持遠程后臺數據翻頁

開發(fā) 后端
不過,這個可以翻頁的表格,只能翻頁本地數據。也就是說,它只能翻已經放入TDataBox中的數據。例如我們一次性在TDataBox中加入了10000條數據。

TWaver Java不但提供了TTable、TElementTable這些表格組件,而且還提供了表格翻頁器TPageNavigator。讓表格和翻頁器結合工作,可以立刻做出一個非常標準的可翻頁的表格界面,如下圖。

 

要讓這兩個組件一起工作,直接這樣new一個實例,并放在界面上就可以了:

  1. TElementTable table = new TElementTable();  
  2. int[] pageSizes = { 1005001000 };  
  3. TPageNavigator nav=new TPageNavigator(table.getTablePaging(), pageSizes) 

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

不過,這個可以翻頁的表格,只能翻頁本地數據。也就是說,它只能翻已經放入TDataBox中的數據。例如我們一次性在TDataBox中加入了10000條數據,可以通過這個翻頁器進行“每頁100條、共有100頁”這樣的翻頁操作。但是大多時候,我們需要的并不是“本地翻頁”,而是“遠程翻頁”。所謂的遠程翻頁,也就是在每次翻頁時候,TDataBox的數據需要被清空,并從遠程服務器動態(tài)重新獲取“下一頁”的數據進行TDataBox加載并且顯示。

如何做到這一點呢?只要用了TWaver Java這一“神器”,做到這一點就不難了。本文就通過一個例子,來說明如何定制一個翻頁器,來攔截翻頁動作,并從服務器獲取翻頁數據,進行動態(tài)顯示。

TElementTable的翻頁,實際上是靠一個TablePaging的接口來完成的。TWaver Java靠一個默認的TablePaging實現(xiàn)來完成了本地翻頁。而我們要做的,就是創(chuàng)建一個遠程翻頁的TablePaging,來代替這個默認實現(xiàn)即可。

TablePaging接口定義了下面這些函數。大多數的函數,都是在問你一些簡單的遠端數據方面的問題:一共有多少記錄?一頁有多少條記錄?一共有多少頁?當前是第幾頁?

并且在***頁、***一頁、上一頁、下一頁等操作發(fā)生時,回調這個接口。所以,我們只要有了后臺數據,就不難回答這些問題。 

  1. public interface TablePaging {  
  2.      public int getCurrentPageIndex();  
  3.      public void setCurrentPageIndex(int currentPageIndex);  
  4.      public int getPageRowSize();  
  5.      public void setPageRowSize(int pageRowSize);  
  6.      public int getPageTotalCount();  
  7.      public int getTotalRowCount();  
  8.      public void firstPage();  
  9.      public void previousPage();  
  10.      public void nextPage();  
  11.      public void lastPage();  
  12.      public void update();  
  13.      public void addPageListener(PageListener pageListener);  
  14.      public void removePageListener(PageListener pageListener);  
  15.  }  

以上函數基本上都可以顧名思義地理解,就不多作介紹了。我們現(xiàn)在假設后臺有一個數據庫,里面有一個客戶地址的table。通過一個SQL查詢服務,我們可以獲得這些翻頁數據。根據這個假設,我們可以做下面的實現(xiàn)。

  1. public class AddressTablePaging implements TablePaging {  
  2.      private SearchPane parent = null;  
  3.      private List pageListeners = new ArrayList();  
  4.      private TElementTable table = null;  
  5.      private int pageIndex = 1;  
  6.      private int pageSize = 100;  
  7.    
  8.      public AddressTablePaging(TElementTable table, SearchPane parent) {  
  9.          this.table = table;  
  10.          this.parent = parent;  
  11.      }  
  12.    
  13.      private void loadPage() {  
  14.          table.getDataBox().clear();  
  15.          try {  
  16.              int start = (pageIndex - 1) * pageSize;  
  17.              Collection<AddressVO> data = Server.searchAddress(..);  
  18.              for (AddressVO vo : data) {  
  19.                  Node node = new Node();  
  20.                  node.setBusinessObject(vo);  
  21.                  table.getDataBox().addElement(node);  
  22.              }  
  23.          } catch (Exception ex) {  
  24.              ex.printStackTrace();  
  25.              JOptionPane.showMessageDialog(table, ex.getMessage());  
  26.          }  
  27.          firePageChanged();  
  28.      }  
  29.    
  30.      @Override 
  31.      public void firstPage() {  
  32.          pageIndex = 1;  
  33.          loadPage();  
  34.      }  
  35.    
  36.      @Override 
  37.      public int getCurrentPageIndex() {  
  38.          return this.pageIndex;  
  39.      }  
  40.    
  41.      @Override 
  42.      public int getPageRowSize() {  
  43.          return this.pageSize;  
  44.      }  
  45.    
  46.      @Override 
  47.      public int getPageTotalCount() {  
  48.          try {  
  49.              int totalCount = getTotalRowCount();  
  50.              int pageCount = totalCount / getPageRowSize();  
  51.              if (totalCount % getPageRowSize() > 0) {  
  52.                  pageCount++;  
  53.              }  
  54.              return pageCount;  
  55.          } catch (Exception ex) {  
  56.              ex.printStackTrace();  
  57.          }  
  58.          return 0;  
  59.      }  
  60.    
  61.      @Override 
  62.      public int getTotalRowCount() {  
  63.          try {  
  64.              return Server.getAddressTotalCount(.);  
  65.          } catch (Exception ex) {  
  66.              ex.printStackTrace();  
  67.          }  
  68.          return 0;  
  69.      }  
  70.    
  71.      @Override 
  72.      public void lastPage() {  
  73.          this.pageIndex = getPageTotalCount();  
  74.          this.loadPage();  
  75.      }  
  76.    
  77.      @Override 
  78.      public void nextPage() {  
  79.          this.pageIndex++;  
  80.          this.loadPage();  
  81.      }  
  82.    
  83.      @Override 
  84.      public void previousPage() {  
  85.          if (this.pageIndex > 1) {  
  86.              pageIndex--;  
  87.          }  
  88.          this.loadPage();  
  89.      }  
  90.    
  91.      @Override 
  92.      public void setCurrentPageIndex(int pageIndex) {  
  93.          this.pageIndex = pageIndex;  
  94.      }  
  95.    
  96.      @Override 
  97.      public void setPageRowSize(int pageSize) {  
  98.          this.pageSize = pageSize;  
  99.      }  
  100.    
  101.      @Override 
  102.      public void addPageListener(PageListener pageListener) {  
  103.          this.pageListeners.add(pageListener);  
  104.      }  
  105.    
  106.      @Override 
  107.      public void removePageListener(PageListener pageListener) {  
  108.          this.pageListeners.remove(pageListener);  
  109.      }  
  110.    
  111.      public void firePageChanged() {  
  112.          for (int i = 0; i < this.pageListeners.size(); i++) {  
  113.              PageListener pageListener = (PageListener) this.pageListeners.get(i);  
  114.              pageListener.pageChanged();  
  115.          }  
  116.      }  
  117.    
  118.      @Override 
  119.      public void update() {  
  120.      }  
  121.  } 

在上面代碼中,所有的翻頁函數,都會集中調用loadPage()這個函數,從后臺真正獲取數據。而函數getTotalRowCount則負責
從后臺獲得“一共有多少條記錄”。其他函數,基本進行轉發(fā)即可。

另外一個需要注意的就是removePageListener/addPageListener等函數。主要用于對監(jiān)聽器進行管理,包括注冊、刪除、觸發(fā)通知等等。

這些也是必須要實現(xiàn)的,不過很簡單,用一個ArrayList維護就行了,觸發(fā)時間時候,直接遍歷、回調即可。

具體通過SQL從后臺調用數據的實現(xiàn),這里就不介紹了。相信每一個實際項目都有不同的數據庫、接口、調用方法方面的差別。這里只是點到為止。

有了這個翻頁器,我們就可以直接用在表格中了。下面繼承一個表格,并用這個翻頁器。

  1. public class AddressTable extends TElementTable {     
  2.      public AddressTablePaging getTablePaging() {  
  3.          return tablePaging;  
  4.      }  
  5.        
  6.  }  

這樣,默認翻頁器被替換,新的后臺翻頁器被置入表格中。***,再通過本文最開始提供的兩行代碼把表格放入界面中,程序就基本完成了。

  1. int[] pageSizes = { 1005001000 };  
  2. this.add(new TPageNavigator(table.getTablePaging(), pageSizes), BorderLayout.CENTER); 

其中pageSizes數組是定義了界面上每頁條數的下拉列表選項,我們可以根據實際應用自己設置,如下圖:

 

這樣,一個完整的后臺翻頁程序就完成了。給表格設置好列、在后臺添加一些數據,跑起來會是這樣(翻頁觀看)

#p#

 

如果再增加一些查詢字段等,就更帥了:

對了,***,再順便給大家介紹一下表格中的可點擊連接是如何做的:

 

要做這種可點擊鏈接,首先要做3件事:1是顯示link,2是顯示手形狀的光標,3是響應鼠標點擊動作。對于1,可以來個“釜底抽薪”:在表格上從根兒上攔截prepareRenderer然后對文字動態(tài)修改為html的a標簽的連接方式進行處理:

  1. @Override 
  2. public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {  
  3.     Element element = this.getElementByRowIndex(row);  
  4.     AddressVO vo = (AddressVO) element.getBusinessObject();  
  5.     Component com = super.prepareRenderer(renderer, row, column);  
  6.     if (!vo.isValid()) {  
  7.         com.setForeground(Color.red);  
  8.     } else {  
  9.         com.setForeground(Color.black);  
  10.     }  
  11.  
  12.     if (column == 2 || column == 3) {  
  13.         String text = ((JLabel) com).getText();  
  14.         text = "<html><a href=\"#\">" + text + "</a></html>";  
  15.         ((JLabel) com).setText(text);  
  16.     }  
  17.     return com;  

對于手形光標,可以通過監(jiān)聽鼠標移動,是否位于鏈接文字上方來動態(tài)修改光標:

  1. this.addMouseMotionListener(new MouseMotionAdapter() {  
  2.      @Override 
  3.      public void mouseMoved(MouseEvent e) {  
  4.          int row = rowAtPoint(e.getPoint());  
  5.          int column = columnAtPoint(e.getPoint());  
  6.          setCursor(Cursor.getDefaultCursor());  
  7.          if (row >= 0 && column >= 0) {  
  8.              if (column == 2 || column == 3) {  
  9.                  setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));  
  10.              }  
  11.          }  
  12.      }  
  13.  }); 

***,對于點擊動作,可以通過給table添加鼠標監(jiān)聽器完成:

  1. this.addMouseListener(new MouseAdapter() {  
  2.      @Override 
  3.      public void mouseClicked(MouseEvent e) {  
  4.          int row = rowAtPoint(e.getPoint());  
  5.          int column = columnAtPoint(e.getPoint());  
  6.          setCursor(Cursor.getDefaultCursor());  
  7.          if (row >= 0 && column >= 0) {  
  8.              if (column == 2 || column == 3) {  
  9.                  Object value = getValueAt(row, column);  
  10.                  //do your action here.  
  11.              }  
  12.          }  
  13.      }  
  14.  }); 

至此,一個完整的可后臺翻頁、可鼠標點擊超鏈接的綜合型table就完成了。在實際使用中,還可以增加更復雜的翻頁和顯示效果。例如在TWaver的兄弟產品2BizBox免費ERP軟件中,就有大量這樣的應用,感興趣的朋友可以到2BizBox.cn去下載安裝一個玩一玩。

 

原文鏈接:http://www.blogjava.net/TWaver/archive/2012/08/03/384716.html

【編輯推薦】

  1. Swing雜記:引入Android的NinePatch技術
  2. JVM的內存溢出異常
  3. Java中的異常對程序效率有無影響
  4. ASP.NET中使用App_Code文件夾的異常
  5. Tomcat中部署后JspFactory報異常的解決方案
責任編輯:張偉 來源: blogjava
相關推薦

2009-12-02 10:33:34

LINQ to SQL

2012-01-17 14:09:54

JavaSwing

2011-03-31 17:02:19

MySQL數據庫遠程連接

2010-08-18 09:03:46

jQueryJSONTrimpath

2009-07-16 13:26:32

Swing增加

2015-09-08 14:52:22

微信應用數據

2010-08-26 14:16:18

DB2.NET開發(fā)

2017-05-18 10:43:36

熱點圖大數據CPU

2017-02-05 17:27:43

2022-03-07 14:38:10

數據中心人工智能

2009-07-10 11:31:45

Swing支持透明和不規(guī)則窗口

2009-07-03 14:23:49

JSP數據分頁

2010-03-23 11:55:32

云計算

2012-03-01 11:54:00

2024-09-21 10:38:19

2009-07-10 11:25:48

Swing應用數據驗證

2009-02-09 10:02:00

遠程終端服務

2011-05-16 10:41:43

MYSQL

2017-03-17 16:10:24

linux進程后臺

2011-08-11 14:33:13

加密RSA虛擬化
點贊
收藏

51CTO技術棧公眾號