?? pagingcomponent.java
字號(hào):
package com.ctic.core.pub.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
* 用于進(jìn)行翻頁的控件,該控件建立了這樣一種機(jī)制:根據(jù)用戶的翻頁請(qǐng)求,從<code>IPagingWorker</code>中取得相應(yīng)的記錄,并
* 顯示到<code>IPagingViewer</code>中。而通過<code>PagingHelper</code>,用戶可以簡單方便的創(chuàng)建實(shí)用的<code>IPagingViewer</code>
* 和<code>IPagingWorker</code>。<br>
* <p>典型使用方式如下:<pre><code>
* PagingComponent pagiComp = new PagingComponent();
* pagiComp.setPageSize(12);
* pagiComp.setPagingViewer(PagingHelper.createPagingViewerFor(mTable));
* pagiComp.setPagingWorker(PagingHelper.createPagingWorkerFor(client.query(params)));(或
* pagiComp.setPagingWorker(PagingHelper.createPagingWorkerFor(ModuleIDs.MODULE_PROD, "productService",
* "queryProductList", new Class[]{Product.class}, new Object[]{paraObj}));)
* ...
* </code></pre>
* 控件運(yùn)行顯示時(shí)大體效果如下:<br><strong> "|<< |< 21-30 /65 >| >>| [3]/20 GO" </strong>
* <p>
* @author Tu_Minglei
*/
public class PagingComponent extends JPanel {
private JLabel firstPageLabel;
private JLabel prevPageLabel;
private JLabel curScopeLabel;
private JLabel nextPageLabel;
private JLabel lastPageLabel;
private JFormattedTextField pageNoFld;
private JLabel tatalPagesLabel;
private JButton turnToPageBtn;
private IPagingViewer pagingViewer;
private IPagingWorker pagingWorker;
private int pageSize = 10;
private int totalRecordCount;
private int currentPageNo;
private Map<JComponent,Boolean> compEnableMap = new HashMap<JComponent, Boolean>();//存儲(chǔ)控件的可用狀態(tài)信息
public PagingComponent(){
initializePagingUI();
refreshComponents();
}
public int getPageSize() {
return pageSize;
}
/**
* 設(shè)置分頁大小(每分頁的記錄數(shù),默認(rèn)值是10)
* @param pageSize
* @return
*/
public PagingComponent setPageSize(int pageSize) {
this.pageSize = pageSize;
showRecords(gotoPage(1));
return this;
}
public IPagingWorker getPagingWorker() {
return pagingWorker;
}
/**
* 設(shè)置實(shí)際提供分頁記錄及相關(guān)信息的<code>IPagingWorker</code>實(shí)現(xiàn)
* @param pagination
*/
public PagingComponent setPagingWorker(IPagingWorker pagingWorker) {
this.pagingWorker = pagingWorker;
this.totalRecordCount = pagingWorker.getTatalRecordCount();
refreshComponents();
showRecords(gotoPage(1));
return this;
}
public IPagingViewer getPagingViewer() {
return pagingViewer;
}
/**
* 設(shè)置用于顯示分頁記錄的<code>IPagingViewer</code>實(shí)現(xiàn)
* @param pagingViewer
*/
public PagingComponent setPagingViewer(IPagingViewer pagingViewer) {
this.pagingViewer = pagingViewer;
showRecords(gotoPage(1));
return this;
}
/**==================================================================*/
private void initializePagingUI() {
firstPageLabel = new JLabel("|<<");
prevPageLabel = new JLabel("|<");
curScopeLabel = new JLabel("0-0 /0");
nextPageLabel = new JLabel(">|");
lastPageLabel = new JLabel(">>|");
pageNoFld = new JFormattedTextField();
tatalPagesLabel= new JLabel("/0");
turnToPageBtn = new JButton("GO");
pageNoFld.setFormatterFactory(new DefaultFormatterFactory(new NumberFormatter()));
addMouseListenerFor(firstPageLabel);
addMouseListenerFor(prevPageLabel);
addMouseListenerFor(nextPageLabel);
addMouseListenerFor(lastPageLabel);
addActionListenerFor(turnToPageBtn);
String columnSpecStr = "7dlu:grow, " + //for overhead space
"fill:max(21;pref), 3dlu, " + //for |<<
"fill:max(21;pref), 5dlu, " + //for |<
"center:max(30;pref), 5dlu, " + //for current record scope
"fill:max(21;pref), 3dlu, " + //for >|
"fill:max(21;pref), 7dlu, " + //for >>|
"fill:max(30;pref), " + //for input field
"left:pref, " + //for total pages label
"3dlu, pref"; //for "go" button
setLayout(new FormLayout(columnSpecStr, "pref"));
CellConstraints cc = new CellConstraints();
add(firstPageLabel,cc.xy(2, 1));
add(prevPageLabel, cc.xy(4, 1));
add(curScopeLabel, cc.xy(6, 1));
add(nextPageLabel, cc.xy(8, 1));
add(lastPageLabel, cc.xy(10, 1));
add(pageNoFld, cc.xy(12, 1));
add(tatalPagesLabel,cc.xy(13, 1));
add(turnToPageBtn, cc.xy(15, 1));
}
/**
* 更新控件內(nèi)部狀態(tài)
*/
protected void refreshComponents(){
compEnableMap.put(firstPageLabel,hasPage(currentPageNo - 1));
compEnableMap.put(prevPageLabel, hasPage(currentPageNo - 1));
compEnableMap.put(nextPageLabel, hasPage(currentPageNo + 1));
compEnableMap.put(lastPageLabel, hasPage(currentPageNo + 1));
compEnableMap.put(turnToPageBtn, true);
initializeLabel(firstPageLabel);
initializeLabel(prevPageLabel);
initializeLabel(nextPageLabel);
initializeLabel(lastPageLabel);
pageNoFld.setText(""+currentPageNo);
curScopeLabel.setText(curFirstRecordNo()+"-"+curLastRecordNo()+" /"+totalRecordCount+" ");
tatalPagesLabel.setText("/"+totalPageCount());
}
/**-----------------------------------------------------------------*/
private void addMouseListenerFor(final JLabel label){
label.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent e) {
activateLabel(label);
}
public void mouseExited(MouseEvent e) {
passivateLabel(label);
}
public void mouseClicked(MouseEvent e) {
pageTurning(label);
}
});
}
private void addActionListenerFor(final JButton turnToBtn){
turnToBtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
pageTurning(turnToBtn);
}
});
}
private void initializeLabel(JLabel label){
passivateLabel(label);
}
/**
* 激活顯示指定標(biāo)簽
* @param label
*/
private void activateLabel(JLabel label){
if(compEnableMap.get(label)){
label.setFont(new Font(label.getFont().getName(), Font.BOLD, label.getFont().getSize()));
label.setForeground(Color.BLUE);
label.setBorder(new BevelBorder(BevelBorder.RAISED));
}else{
label.setFont(new Font(label.getFont().getName(), Font.BOLD, label.getFont().getSize()));
label.setForeground(Color.DARK_GRAY);
// label.setBorder(new BevelBorder(BevelBorder.RAISED));
}
}
/**
* 鈍化顯示指定標(biāo)簽
* @param label
*/
private void passivateLabel(JLabel label){
if(compEnableMap.get(label)){
label.setFont(new Font(label.getFont().getName(), Font.PLAIN, label.getFont().getSize()));
label.setForeground(Color.BLACK);
label.setBorder(null);
}else{
label.setFont(new Font(label.getFont().getName(), Font.PLAIN, label.getFont().getSize()));
label.setForeground(Color.GRAY);
label.setBorder(null);
}
}
/**
* 根據(jù)事件來源的不同,實(shí)際執(zhí)行翻頁及相關(guān)操作的方法
* @param sourceComp
*/
private void pageTurning(JComponent sourceComp){
if(!compEnableMap.get(sourceComp)) return; //來源控件的狀態(tài)為不可用,忽略翻頁命令
if(sourceComp == firstPageLabel){
showRecords(gotoPage(1));
sourceComp.setBorder(new BevelBorder(BevelBorder.LOWERED));
}
if(sourceComp == prevPageLabel){
showRecords(gotoPage(currentPageNo -1));
sourceComp.setBorder(new BevelBorder(BevelBorder.LOWERED));
}
if(sourceComp == nextPageLabel){
showRecords(gotoPage(currentPageNo +1));
sourceComp.setBorder(new BevelBorder(BevelBorder.LOWERED));
}
if(sourceComp == lastPageLabel){
showRecords(gotoPage(totalPageCount()));
sourceComp.setBorder(new BevelBorder(BevelBorder.LOWERED));
}
if(sourceComp == turnToPageBtn && pageNoFld.getValue() != null){
int pageNo = ((Long)pageNoFld.getValue()).intValue();
showRecords(gotoPage(pageNo));
}
}
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
* 接口及內(nèi)部類
**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/**
* 以備控件自動(dòng)調(diào)用的用于顯示相應(yīng)結(jié)果記錄的接口
*
* @author Tu_Minglei
*/
public interface IPagingViewer {
/**
* 顯示傳入的記錄
* @param records
*/
void showRecords(List records);
}
/**--------------------------------------------------------------*/
/**
* 實(shí)際獲取指定范圍記錄及提供相關(guān)信息的接口
*
* @author Tu_Minglei
*/
public interface IPagingWorker {
/**
* 獲得總記錄數(shù)
* @return
*/
int getTatalRecordCount();
/**
* 獲得指定范圍的記錄
* @param startRowNo
* @param count
* @return
*/
List getRecords(int startRowNo, int count);
}
/**+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
* 用于分頁操作的助手方法
**+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
protected int totalPageCount() {
return (totalRecordCount <= 0) ? 0 : (totalRecordCount/pageSize + 1);
}
protected int curFirstRecordNo() {
return (totalRecordCount <= 0) ? 0 : ((currentPageNo - 1) * pageSize + 1);
}
protected int curLastRecordNo() {
return Math.min((currentPageNo * pageSize), totalRecordCount);
}
protected boolean hasPage(int pageNo) {
return (pageNo > 0 && pageNo <= totalPageCount());
}
protected List gotoPage(int pageNo) {
int firstRow = (pageNo - 1) * pageSize + 1;
List records = getRecords(firstRow, pageSize);
this.currentPageNo = pageNo;
refreshComponents();
return records;
}
private List getRecords(int firstRowNo, int count){
return (pagingWorker == null) ? null : pagingWorker.getRecords(firstRowNo, count);
}
private void showRecords(List records) {
if(pagingViewer != null) pagingViewer.showRecords(records);
}
// *****************************************************************
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 60));
frame.setLocation(100, 100);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(new PagingComponent(), BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -