我想做一个数据库表中数据在JTabel中分页显示的效果,大致有了一个思路但是觉得比较繁琐,还请各位不吝指教,谢谢!

解决方案 »

  1.   

    同Struts
    只是需要刷新table---------------------
    JM2.0可以轻松实现
    http://free5.ys168.com/?1shome
      

  2.   

    我大致做了一个,还有个问题实现不了:   我想如果是点击下一页等同一个表翻页时,JTable的标题栏不变,把原来JTable中rows的数据先删除然后添加新数据。如果是查询另一个表时,则刷新整个表。   不过我点击下一页时表中数据并没有刷新,真郁闷!代码如下:
        package EventDemo.frame;import java.sql.*;import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;public class dbshow extends JFrame { private ResultSet resultSet; private JTable table; private JTextField tableName; private JButton submitQuery, first, previous, next, end; private JDBCBean db; private int curPage = 1;// 当前是第几页 private int maxPage = 0;// 一共有多少页 private int maxRowCount = 0;// 一共有多少行 private int rowsPerPage = 20;// 每页有多少行 private JPanel topPanel = null; private JPanel buttonPane = null; private Container c = null; public dbshow() { super("input the table name");
    db = new JDBCBean(); try {
    db.setConnstr("org.gjt.mm.mysql.Driver",
    "jdbc:mysql://localhost:3306/sanhua", "root", "hpmysql");
    } catch (NullPointerException sqlex) {
    System.err.println("无法接收数据");
    sqlex.printStackTrace();
    System.exit(1); // terminate program
    } finally {
    if (null != db.getCurException()) {
    System.out.println("<font color='blue'>出错了!"
    + db.getCurException().toString() + "</font><br>");
    }
    }
    String test = "testtree";
    tableName = new JTextField(test);
    submitQuery = new JButton("Querry");
    first = new JButton("first");
    first.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    curPage = 1;
    getTable(1);
    }
    });
    previous = new JButton("previous");
    previous.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if (curPage > 1) {
    curPage--;
    } else {
    curPage = 1;
    }
    getTable(1);
    }
    });
    next = new JButton("next");
    next.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if (curPage >= maxPage) {
    curPage++;
    } else {
    curPage = maxPage;
    }
    getTable(1);
    }
    });
    end = new JButton("end");
    end.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    curPage = maxPage;
    getTable(1);
    }
    });
    // Button事件
    submitQuery.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    initial();
    getTable(0); }
    }); topPanel = new JPanel();
    buttonPane = new JPanel(new FlowLayout());
    table = new JTable(); buttonPane.add(first);
    buttonPane.add(previous);
    buttonPane.add(next);
    buttonPane.add(end); topPanel.setLayout(new BorderLayout());
    // 将框布置到 "CENTER"
    topPanel.add(new JScrollPane(tableName), BorderLayout.CENTER);
    // 将"提交"布置到 "SOUTH"
    topPanel.add(submitQuery, BorderLayout.SOUTH); table = new JTable();
    c = getContentPane();
    c.setLayout(new BorderLayout());
    // 将"topPanel"框布置到 "NORTH"
    c.add(topPanel, BorderLayout.NORTH);
    // 将"table"框布置到 "CENTER" c.add(table, BorderLayout.CENTER);
    c.add(buttonPane, BorderLayout.SOUTH);
    // getTable();
    setSize(500, 300);
    // 显示Form
    show();
    } // 设置分页的各个参数
    private void initial() {
    try {
    String tablename = tableName.getText().trim();
    if (!tablename.equals("")) {
    resultSet = db
    .executeQuery("select count(*) from " + tablename);
    resultSet.next();
    maxRowCount = resultSet.getInt(1);
    if (maxRowCount % rowsPerPage == 0) {
    maxPage = maxRowCount / rowsPerPage;
    } else {
    maxPage = maxRowCount / rowsPerPage + 1;
    }
    }
    } catch (SQLException se) {
    se.printStackTrace();
    } finally {
    try {
    resultSet.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    } private void getTable(int flag) {
    try {
    // 执行行SQL
    String tablename = tableName.getText().trim();
    if ((!tablename.equals("show tables;")) && (!tablename.equals(""))) {
    resultSet = db.executeQuery("SELECT * FROM " + tablename
    + " LIMIT " + (curPage - 1) * rowsPerPage + ","
    + rowsPerPage);
    // 在表格中显示结果
    displayResultSet(resultSet, flag);
    }
    } catch (SQLException sqlex) {
    sqlex.printStackTrace();
    }
    } private void displayResultSet(ResultSet rs, int num) throws SQLException {
    // 定位到第一条
    boolean moreRecords = rs.next();
    // 如果没有提示一条消息
    if (!moreRecords) {
    JOptionPane.showMessageDialog(this, "结果集中无数据");
    setTitle("无数据显示");
    return;
    }
    if (num==0) {
    Vector columnHeads = new Vector();
    Vector rows = new Vector();
    try {
    // 取字段的名称
    ResultSetMetaData rsmd = rs.getMetaData();
    for (int i = 1; i <= rsmd.getColumnCount(); ++i)
    columnHeads.addElement(rsmd.getColumnName(i));
    // 取结果集
    do {
    rows.addElement(getNextRow(rs, rsmd));
    } while (rs.next());
    // 在表格中显示结果
    c.remove(1);
    table = new JTable(rows, columnHeads);
    // Container c = getContentPane();
    c.add(new JScrollPane(table), BorderLayout.CENTER);
    // 刷新Table
    c.validate();
    System.out.println(c.getComponentCount());
    } catch (SQLException sqlex) {
    sqlex.printStackTrace();
    }
    }else{System.out.println("hello");
    Vector rows = new Vector();
    ResultSetMetaData rsmd = rs.getMetaData();
    table.removeRowSelectionInterval(0,table.getRowCount()-1);
    System.out.println("hello1");
    do {
    rows.addElement(getNextRow(rs, rsmd));
    } while (rs.next());
    table.validate();
                c.validate();
    }
    } private Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd)
    throws SQLException {
    Vector currentRow = new Vector();
    for (int i = 1; i <= rsmd.getColumnCount(); ++i)
    currentRow.addElement(rs.getString(i));
    // 返回一条记录
    return currentRow;
    } public void shutDown() {
    try {
    if (resultSet == null) {
    db.closeDBN();
    } else {
    db.closeDB();
    }
    } catch (Exception sqlex) {
    System.err.println("Unable to disconnect");
    sqlex.printStackTrace();
    }
    } public static void main(String args[]) {
    final dbshow app = new dbshow();
    app.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    app.shutDown();
    System.exit(0);
    }
    });
    }
    }
       
      

  3.   

    我大致做了一个,还有个问题实现不了:我想如果是点击下一页等同一个表翻页时,JTable的标题栏不变,把原来JTable中rows的数据先删除然后添加新数据。如果是查询另一个表时,则刷新整个表。不过我点击下一页时表中数据并没有刷新,真郁闷!
    ------------------------
    你不能这样写,Java不是VB,不能直接修改视图部分.
    你应该把数据就在TableModel里,并设table.setModel(tableModel),然后修改TableModel,并使其产生事件,通知JTable就可以了.