swing中的JTable如何实现分页显示??上页、下页、首页、尾页功能

解决方案 »

  1.   

    package util.gui;import javax.swing.*;
    import java.awt.event.*;public class PagePanel extends JPanel implements ActionListener
    {
    // JButton 
    private JButton btnFirstPage = new JButton( "首页" );
    private JButton btnPreviousPage = new JButton( "上页" );
    private JButton btnNextPage = new JButton( "下页" );
    private JButton btnLastPage = new JButton( "末页" );

    // JLabel
    private JLabel lblPage = new JLabel( "0/0" );

    // Model
    PagePanelModel model;
    public void setModel( PagePanelModel m )
    {
    model = m;
    }

    /**
    * setGUI
    */
    private void setGUI()
    {
    add( btnFirstPage );
    add( btnPreviousPage );
    add( btnNextPage );
    add( btnLastPage );

    add( lblPage );

    readModel();
    }

    private void addActionListener()
    {
    btnFirstPage.addActionListener( this );
    btnPreviousPage.addActionListener( this );
    btnNextPage.addActionListener( this );
    btnLastPage.addActionListener( this );

    }
    /**
    * 模型已经改变,修改界面.
    */
    void readModel()
    {
    //System.out.println( model.getTotalPage() + "   " + model.getCurrPage() );
    if( model.getTotalPage() == 0 || model.getCurrPage() == 0 )
        {
         btnFirstPage.setEnabled( false );
         btnPreviousPage.setEnabled( false );
         btnNextPage.setEnabled( false );
         btnLastPage.setEnabled( false );
        }
        else
        {
         btnFirstPage.setEnabled( true );
         btnLastPage.setEnabled( true );
        
         // btnPreviousPage
         if( model.getCurrPage() == 1 )
        {
         btnPreviousPage.setEnabled( false );
        }
        else
        {
         btnPreviousPage.setEnabled( true );     
        }
        
        // btnNextPage
        if( model.getCurrPage()<model.getTotalPage() )
        {
         btnNextPage.setEnabled( true );
        }
        else
        {
         btnNextPage.setEnabled( false );     
        }
        }
    lblPage.setText( model.getCurrPage() + "/" + model.getTotalPage() );
    }

    /**
    * 这是四个protected函数,供子类调用,来维护组件自己的状态.
    */
    private void first()
    {
    clickedButton = FIRST;

    model.setCurrPage( 1 );
    }
    /*
    *
    */
    private void next()
    {
    clickedButton = NEXT;

    int curr = model.getCurrPage();
    model.setCurrPage( ++curr );
    }
    /*
    *
    */
    private void previous()
    {
    clickedButton = PREVIOUS;

    int curr = model.getCurrPage();
    model.setCurrPage( --curr );
    }
    /*
    *
    */
    private void last()
    {
    clickedButton = LAST;

    model.setCurrPage( model.getTotalPage() );
    }

    public void setCurrPage( int str )
    {
    model.setCurrPage( str );
    }
    public void setTotalPage( int str )
    {
    model.setTotalPage( str );
    }

    public PagePanel()
    {
    this( new PagePanelModel() );
    }

    public PagePanel( PagePanelModel m )
    {
    model = m;
    model.setView( this );

    setGUI();
    addActionListener();
    }

    public PagePanelModel getModel()
    {
    return model;
    }
    /**
    * implements ActionListener
    */
    public void actionPerformed( ActionEvent e )
    {
    Object o = e.getSource();

    if( o == btnFirstPage ) first();
    if( o == btnNextPage ) next();
    if( o == btnPreviousPage ) previous();
    if( o == btnLastPage ) last();

    btnClicked();
    }

    /**
    * 专供子类继承使用,告知已经点击了.
    */
    protected void btnClicked()
    {
    }

    public int getClickedButton()
    {
    return clickedButton;
    }
    public static void main( String[] args )
    {
    JFrame f = new JFrame();
    PagePanelModel model = new PagePanelModel();
    PagePanel pp = new PagePanel( model );
    model.setTotalPage( 5 );
    model.setCurrPage( 1 );
    JPanel p = new JPanel();
    p.add( pp );
    f.getContentPane().add( p );

    f.setSize( 320 , 240 );
    f.setVisible( true );


    }

    private int clickedButton;

    public static final int FIRST = 1;
    public static final int PREVIOUS = 2;
    public static final int NEXT = 3;
    public static final int LAST = 4;

    /* 子类的例子,覆盖了protected函数
    private class SouthPagePanel extends PagePanel
    {
    public SouthPagePanel( PagePanelModel m )
    {
    super( m );
    } protected void btnClicked()
    {
    controller.pagePanelBtnClick();
    }
    }*/
    }
      

  2.   

    package util.gui;import javax.swing.JOptionPane;public class PagePanelModel
    {
    private PagePanel view;
    void setView( PagePanel v )
    {
    view = v;
    }
    // currPage
    private int currPage = 1;
    public void setCurrPage( int str )
    {
    if( str<0 )
        {
         currPage = 0;
         JOptionPane.showMessageDialog(  view , "当前页数不能为负数:" + str );
        }
        else
        {
    currPage = str;
    }
    fireDataChanged();
    }
    public int getCurrPage()
    {
    return currPage;
    }
    // totalPage
    private int totalPage = 0;
    public void setTotalPage( int str )
    {
    if( str<0 )
        {
         totalPage = 0;
         JOptionPane.showMessageDialog( view , "总页数不能为负数::" + str );
        }
        else
        {
    totalPage = str;
    }
    fireDataChanged();
    }
    public int getTotalPage()
    {
    return totalPage;
    }

    private void fireDataChanged()
    {
    view.readModel();
    }
    }
      

  3.   

    应该在读取数据的resultset时分页,而不应该在jtable显示时分页,这样可以缩短响应时间,而且jtable的显示页面的代码更简洁
      

  4.   

    谢谢vssivl(克斯) , 我试试看
      

  5.   

    分页都差不多吧
    web分页弄数了,swing里的一样的,使用的组建不同而已