数据库表中数据在JTabel中分页显示 我想做一个数据库表中数据在JTabel中分页显示的效果,大致有了一个思路但是觉得比较繁琐,还请各位不吝指教,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 同Struts只是需要刷新table---------------------JM2.0可以轻松实现http://free5.ys168.com/?1shome 我大致做了一个,还有个问题实现不了: 我想如果是点击下一页等同一个表翻页时,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); } }); }} 我大致做了一个,还有个问题实现不了:我想如果是点击下一页等同一个表翻页时,JTable的标题栏不变,把原来JTable中rows的数据先删除然后添加新数据。如果是查询另一个表时,则刷新整个表。不过我点击下一页时表中数据并没有刷新,真郁闷!------------------------你不能这样写,Java不是VB,不能直接修改视图部分.你应该把数据就在TableModel里,并设table.setModel(tableModel),然后修改TableModel,并使其产生事件,通知JTable就可以了. 3n+1问题 100分求讨论多线程文本文件单词统计 java算法的问题 大家进来帮下忙 base64大图片 无法还原 关于JXL输出Excel单元格换行问题! lomboz+jboss+eclipse配置j2ee项目提示Attribute "work-dir" must be declared for element type "web-app". jdk 1.5配置的问题 frame.setVisible(true)出错,不能连接到相应界面。 请教一个线程的问题,对线程的概念模糊,请高手赐教 JPanel上如何动态增加JButton? jar包运行的一个问题?
只是需要刷新table---------------------
JM2.0可以轻松实现
http://free5.ys168.com/?1shome
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);
}
});
}
}
------------------------
你不能这样写,Java不是VB,不能直接修改视图部分.
你应该把数据就在TableModel里,并设table.setModel(tableModel),然后修改TableModel,并使其产生事件,通知JTable就可以了.