溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么讓Swing表格支持遠(yuǎn)程后臺(tái)數(shù)據(jù)翻頁(yè)

發(fā)布時(shí)間:2021-10-29 16:31:19 來(lái)源:億速云 閱讀:150 作者:柒染 欄目:編程語(yǔ)言

怎么讓Swing表格支持遠(yuǎn)程后臺(tái)數(shù)據(jù)翻頁(yè),針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

TWaver Java不但提供了TTable、TElementTable這些表格組件,而且還提供了表格翻頁(yè)器TPageNavigator。讓表格和翻頁(yè)器結(jié)合工作,可以立刻做出一個(gè)非常標(biāo)準(zhǔn)的可翻頁(yè)的表格界面,如下圖。

怎么讓Swing表格支持遠(yuǎn)程后臺(tái)數(shù)據(jù)翻頁(yè)

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

TElementTable table = new TElementTable();  int[] pageSizes = { 100, 500, 1000 };  TPageNavigator nav=new TPageNavigator(table.getTablePaging(), pageSizes)

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

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

如何做到這一點(diǎn)呢?只要用了TWaver Java這一“神器”,做到這一點(diǎn)就不難了。本文就通過(guò)一個(gè)例子,來(lái)說(shuō)明如何定制一個(gè)翻頁(yè)器,來(lái)攔截翻頁(yè)動(dòng)作,并從服務(wù)器獲取翻頁(yè)數(shù)據(jù),進(jìn)行動(dòng)態(tài)顯示。

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

TablePaging接口定義了下面這些函數(shù)。大多數(shù)的函數(shù),都是在問(wèn)你一些簡(jiǎn)單的遠(yuǎn)端數(shù)據(jù)方面的問(wèn)題:一共有多少記錄?一頁(yè)有多少條記錄?一共有多少頁(yè)?當(dāng)前是第幾頁(yè)?

并且在***頁(yè)、***一頁(yè)、上一頁(yè)、下一頁(yè)等操作發(fā)生時(shí),回調(diào)這個(gè)接口。所以,我們只要有了后臺(tái)數(shù)據(jù),就不難回答這些問(wèn)題。

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);   }

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

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<AddressVO> 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() {       }   }

在上面代碼中,所有的翻頁(yè)函數(shù),都會(huì)集中調(diào)用loadPage()這個(gè)函數(shù),從后臺(tái)真正獲取數(shù)據(jù)。而函數(shù)getTotalRowCount則負(fù)責(zé)
從后臺(tái)獲得“一共有多少條記錄”。其他函數(shù),基本進(jìn)行轉(zhuǎn)發(fā)即可。

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

這些也是必須要實(shí)現(xiàn)的,不過(guò)很簡(jiǎn)單,用一個(gè)ArrayList維護(hù)就行了,觸發(fā)時(shí)間時(shí)候,直接遍歷、回調(diào)即可。

具體通過(guò)SQL從后臺(tái)調(diào)用數(shù)據(jù)的實(shí)現(xiàn),這里就不介紹了。相信每一個(gè)實(shí)際項(xiàng)目都有不同的數(shù)據(jù)庫(kù)、接口、調(diào)用方法方面的差別。這里只是點(diǎn)到為止。

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

public class AddressTable extends TElementTable {          public AddressTablePaging getTablePaging() {           return tablePaging;       }          }

這樣,默認(rèn)翻頁(yè)器被替換,新的后臺(tái)翻頁(yè)器被置入表格中。***,再通過(guò)本文最開(kāi)始提供的兩行代碼把表格放入界面中,程序就基本完成了。

int[] pageSizes = { 100, 500, 1000 };  this.add(new TPageNavigator(table.getTablePaging(), pageSizes), BorderLayout.CENTER);

其中pageSizes數(shù)組是定義了界面上每頁(yè)條數(shù)的下拉列表選項(xiàng),我們可以根據(jù)實(shí)際應(yīng)用自己設(shè)置,如下圖:

怎么讓Swing表格支持遠(yuǎn)程后臺(tái)數(shù)據(jù)翻頁(yè)

這樣,一個(gè)完整的后臺(tái)翻頁(yè)程序就完成了。給表格設(shè)置好列、在后臺(tái)添加一些數(shù)據(jù),跑起來(lái)會(huì)是這樣(翻頁(yè)觀看)

怎么讓Swing表格支持遠(yuǎn)程后臺(tái)數(shù)據(jù)翻頁(yè)

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

怎么讓Swing表格支持遠(yuǎn)程后臺(tái)數(shù)據(jù)翻頁(yè)

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

怎么讓Swing表格支持遠(yuǎn)程后臺(tái)數(shù)據(jù)翻頁(yè)

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

@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 = "<html><a href=\"#\">" + text + "</a></html>";          ((JLabel) com).setText(text);      }      return com;  }

對(duì)于手形光標(biāo),可以通過(guò)監(jiān)聽(tīng)鼠標(biāo)移動(dòng),是否位于鏈接文字上方來(lái)動(dòng)態(tài)修改光標(biāo):

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));               }           }       }   });

***,對(duì)于點(diǎn)擊動(dòng)作,可以通過(guò)給table添加鼠標(biāo)監(jiān)聽(tīng)器完成:

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.               }           }       }   });

至此,一個(gè)完整的可后臺(tái)翻頁(yè)、可鼠標(biāo)點(diǎn)擊超鏈接的綜合型table就完成了。在實(shí)際使用中,還可以增加更復(fù)雜的翻頁(yè)和顯示效果。例如在TWaver的兄弟產(chǎn)品2BizBox免費(fèi)ERP軟件中,就有大量這樣的應(yīng)用,感興趣的朋友可以到2BizBox.cn去下載安裝一個(gè)玩一玩。

怎么讓Swing表格支持遠(yuǎn)程后臺(tái)數(shù)據(jù)翻頁(yè)

關(guān)于怎么讓Swing表格支持遠(yuǎn)程后臺(tái)數(shù)據(jù)翻頁(yè)問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI