- 浏览: 42416 次
- 性别:
- 来自: 深圳
-
最新评论
-
wxq520:
...
十年Java艰辛路 -
toeo:
写的很不错呢.每天进行工作.进行思考.想着什么才是出路.想着自 ...
陋室忆昔→思吾二十余载之生活境况 -
IT_玲玲:
呵呵 平时我也爱写 随笔的心思
开往春天的地铁 -
meladet:
形容得太贴切太经典了。。明知道是地狱还不能回头
Java之路 -
delivered_zhang:
java对于自己来说只是一个生存的工具,等干不了的时候自然会转 ...
Java之路
最近需要使用JTable,第一次使用,很多不懂,到网上找了很多资料和例子,发现很多例子都没有完全的实现操作数据库里一张表的数据,摸了两天终于懂了一点,写了一个例子,把代码直接复制,修改一下数据库的连接就可以运行了.使用JTable操作数据库的一张表,实现增删改,显示表里所有的数据,点击''添加''按钮在表格插入一行填写数据保存到数据库,可一次插入多行,一次可选择任意多行进行删除,一次可以修改多行的值.有写得不好的地方希望大家指出,一起进步.
共九个类:
一:
package product;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class ProductTableModel extends AbstractTableModel {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
/**changeList用来存放被修改过的数据值,这样做是为了一次修改多行多值,
* 保存的对象是ChangedProduct,只记录被修改过的值.
*/
private static List changeList = new ArrayList();
private List list = new ArrayList();
private String[] column = { "Product_id", "Product Name",
"Product Description", "Status" };
public ProductTableModel() {
}
public ProductTableModel(List list) {
this();
setList(list);
}
public int getColumnCount() {
return column.length;
}
public int getRowCount() {
return list.size();
}
/**
* getValueAt方法就是使得数据在Table显示出来,给每个单元格设值
*/
public Object getValueAt(int arg0, int arg1) {
ProductBean p = (ProductBean) list.get(arg0);
return getPropertyValueByCol(p, arg1);
}
public void addRow(int index, ProductBean p) {
if (index < 0 || index > list.size() - 1) {
list.add(p);
fireTableRowsInserted(list.size(), list.size());
} else {
list.add(index + 1, p);
fireTableRowsInserted(index, index);
}
}
public boolean deleteRow(int index) {
if (index >= 0 && index < list.size()) {
list.remove(index);
fireTableRowsDeleted(index, index);
return true;
} else
return false;
}
public boolean saveRow(int index, ProductBean p) {
if (index >= 0 && index < list.size()) {
list.set(index, p);
fireTableRowsUpdated(index, index);
return true;
} else
return false;
}
public ProductBean getRow(int index) {
if (index >= 0 && index < list.size()) {
return (ProductBean) list.get(index);
} else
return null;
}
public List getNewRow(){
List list=new ArrayList();
List listProduct=getList();
Iterator it=listProduct.iterator();
while(it.hasNext()){
ProductBean p=new ProductBean();
p=(ProductBean)it.next();
if(p.getProduct_id()==0){
list.add(p);
}
}
return list;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
fireTableDataChanged();
}
public String getColumnName(int i) {
return column[i];
}
public void setColumn(String[] column) {
this.column = column;
}
public Object getPropertyValueByCol(ProductBean p, int col) {
switch (col) {
case 0:
return p.getProduct_id();
case 1:
return p.getProduct_name();
case 2:
return p.getProduct_desc();
case 3:
return p.getProduct_status();
}
return null;
}
public void setPropertyValueByCol(ProductBean p, String value, int col) {
switch (col) {
case 1:
p.setProduct_name(value);
break;
case 2:
p.setProduct_desc(value);
break;
case 3:
p.setProduct_status(value);
break;
}
fireTableDataChanged();
}
public boolean isCellEditable(int row, int column) {
return true;
}
/**
* setValueAt方法是使增加或修改值的时候生效,aValue就是你在单元格填的值,
* 要把这些值保存到数据源中
*/
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
ProductBean p = (ProductBean) list.get(rowIndex);
setPropertyValueByCol(p, aValue.toString(), columnIndex);
this.fireTableCellUpdated(rowIndex, columnIndex);
}
public static List getChangeList() {
return changeList;
}
public static void setChangeList(List changeList) {
ProductTableModel.changeList = changeList;
}
}
二:
package product;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableColumnModel;
public class ProductFrame extends JFrame {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
private JPanel panelTop = null;
private JLabel labHeader = null;
private JPanel panelBottom = null;
private JButton add = null;
private JButton delete = null;
private JButton save = null;
private JScrollPane scroll = null;
private JTable table = null;
private ProductTableModel model = null;
private List listProduct = null;
public ProductTableModel getModel() {
if (null == model) {
model = new ProductTableModel(listProduct);
//给model添加一个监听,当修改的时候将触发该事件,代表事件的类是ChangeEvent
model.addTableModelListener(new ChangeEvent(model));
return model;
}
return model;
}
public JLabel getLabHeader() {
if (null == labHeader) {
labHeader = new JLabel("Maintaince Product Information");
return labHeader;
}
return labHeader;
}
public JTable getTable() {
if (null == table) {
table = new JTable(getModel());
table.setEnabled(true);
table.setRowSelectionAllowed(true);
table.setBackground(Color.YELLOW);
/**
* 隐藏第一列ID,不显示出来
*/
DefaultTableColumnModel dcm = (DefaultTableColumnModel)table.getColumnModel();
dcm.getColumn(0).setMinWidth(0);
dcm.getColumn(0).setMaxWidth(0);
return table;
}
return table;
}
public JScrollPane getPanTable() {
if (null == scroll) {
scroll = new JScrollPane();
scroll.setViewportView(getTable());
return scroll;
}
return scroll;
}
public JPanel getPanelTop() {
if (null == panelTop) {
panelTop = new JPanel();
panelTop.setLayout(new FlowLayout(FlowLayout.CENTER));
panelTop.add(getLabHeader());
return panelTop;
}
return panelTop;
}
public JPanel getPanelBottom() {
if (null == panelBottom) {
panelBottom = new JPanel();
panelBottom.setLayout(new FlowLayout(FlowLayout.CENTER));
panelBottom.add(getAdd());
panelBottom.add(getDelete());
panelBottom.add(getSave());
return panelBottom;
}
return panelBottom;
}
public JButton getAdd() {
/**
* 点该按钮的时候调用addProduct()方法,在数据源(listProduct)将
* 增加一个元素,没设值前都是null.
*/
if (null == add) {
add = new JButton("New");
add.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addProduct();
}
});
return add;
}
return add;
}
public JButton getDelete() {
if (null == delete) {
delete = new JButton("Delete");
delete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
/**
* 支持一次选中多行后删除
*/
int[] rows=getTable().getSelectedRows();
if(rows.length>0){
int flag=JOptionPane.showConfirmDialog(null, "确定删除?");
if(flag==JOptionPane.YES_OPTION)
deleteProduct();
}
else
JOptionPane.showMessageDialog(null,"请选择要删除的行!");
}
});
return delete;
}
return delete;
}
public JButton getSave() {
if (null == save) {
save = new JButton("save");
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveProduct();
JOptionPane.showMessageDialog(null,"更新成功!");
}
});
return save;
}
return save;
}
public void addProduct() {
ProductBean p = new ProductBean();
getModel().addRow(getTable().getSelectedRow(), p);
}
public void saveProduct() {
DaoInterface dao=DaoFactory.getDao();
List changeList=getModel().getChangeList();
//如果有修改过就调用update方法
if(changeList.size()>0){
dao.update(changeList);
changeList.clear();
}
List newRow=getModel().getNewRow();
//如果是新增就调用saveList,支持一次增加多行
if(newRow.size()>0){
dao.saveList(newRow);
getModel().setList(dao.getList());
getTable().updateUI();
newRow.clear();
}
}
public void deleteProduct() {
/**支持一次删除多行,先获得所有选中的行,然后按照行数取得Product实例,
* 放进一个list,然后传给操作数据库的deleteList方法.
*/
int[] rows=getTable().getSelectedRows();
ArrayList list=new ArrayList();
DaoInterface dao=DaoFactory.getDao();
for(int i=rows.length-1;i>=0;i--){
list.add(getModel().getRow(rows[i]));
getModel().deleteRow(rows[i]);
}
dao.deleteList(list);
getTable().updateUI();
list.clear();
}
public void initData() {
/**
* 初始化数据源,从数据库里把数据拿出来,然后它会调用
* getValueAt方法来一个单元格一个单元格来设值,让它显示出来.
*/
listProduct = new ArrayList();
DaoInterface dao=DaoFactory.getDao();
listProduct=dao.getList();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public ProductFrame() {
initData();
Container c = this.getContentPane();
c.setLayout(new BorderLayout());
c.add(getPanelTop(), BorderLayout.NORTH);
c.add(getPanelBottom(), BorderLayout.SOUTH);
c.add(getPanTable(), BorderLayout.CENTER);
this.setSize(new Dimension(600, 400));
this.setVisible(true);
}
public static void main(String[] args) {
ProductFrame frame = new ProductFrame();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
三:
package product;
public class ProductBean {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
private int product_id;
private String product_name;
private String product_desc;
private String product_status;
public String getProduct_name() {
return product_name;
}
public void setProduct_name(String product_name) {
this.product_name = product_name;
}
public String getProduct_desc() {
return product_desc;
}
public void setProduct_desc(String product_desc) {
this.product_desc = product_desc;
}
public String getProduct_status() {
return product_status;
}
public void setProduct_status(String product_status) {
this.product_status = product_status;
}
public int getProduct_id() {
return product_id;
}
public void setProduct_id(int product_id) {
this.product_id = product_id;
}
}
四:
package product;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBConnection {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
private static Connection conn;
public static Connection getConn() {
String driverName = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@192.168.0.66:1521:test";
String userName = "JACKTRAINING";
String pwd = "JACKTRAINING";
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url, userName, pwd);
} catch (ClassNotFoundException e) {
System.out.println("装载驱动出错!");
} catch (SQLException e) {
System.out.println("获取数据库连接出错!");
e.printStackTrace();
}
return conn;
}
}
五:
package product;
import java.util.ArrayList;
import java.util.List;
public interface DaoInterface {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
public List getList();
public void saveList(List list);
public void deleteList(List list);
public void update(List list);
}
六:
package product;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;
public class DaoImpl implements DaoInterface {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
public List getList() {
Connection conn = JDBConnection.getConn();
String s1 = "select * from justin_jtable_product order by product_id asc";
PreparedStatement ps = null;
ResultSet rs = null;
List list = new ArrayList();
try {
ps = conn.prepareStatement(s1);
rs = ps.executeQuery();
} catch (SQLException e) {
System.out.println("取出全部数据出错!");
JOptionPane.showMessageDialog(null, "取出全部数据出错!");
e.printStackTrace();
}
try {
while (rs.next()) {
ProductBean p = new ProductBean();
p.setProduct_id(rs.getInt(1));
p.setProduct_name(rs.getString(2));
p.setProduct_desc(rs.getString(3));
p.setProduct_status(rs.getString(4));
list.add(p);
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "取出全部数据出错!");
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "关闭数据连接时出错!");
e.printStackTrace();
}
}
return list;
}
public void saveList(List list) {
String s1 = "";
Connection conn = JDBConnection.getConn();
PreparedStatement ps = null;
try {
Iterator it = list.iterator();
while (it.hasNext()) {
ProductBean p = (ProductBean) it.next();
String name = p.getProduct_name();
String desc = p.getProduct_name();
String status = p.getProduct_status();
int id = p.getProduct_id();
s1 = "insert into justin_jtable_product(product_name,"
+ "product_desc,product_status) values(?,?,?)";
ps = conn.prepareStatement(s1);
ps.setString(1, name);
ps.setString(2, desc);
ps.setString(3, status);
ps.executeUpdate();
}
} catch (SQLException e) {
System.out.println("添加数据时出错!");
JOptionPane.showMessageDialog(null, "添加数据时出错!");
e.printStackTrace();
} finally {
try {
ps.close();
conn.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "关闭数据连接时出错!");
e.printStackTrace();
}
}
}
public void deleteList(List list) {
String str = "delete from justin_jtable_product where product_id=?";
int id = 0;
Iterator it = list.iterator();
Connection conn = JDBConnection.getConn();
PreparedStatement ps = null;
try {
while (it.hasNext()) {
id = ((ProductBean) it.next()).getProduct_id();
ps = conn.prepareStatement(str);
ps.setInt(1, id);
ps.executeUpdate();
}
} catch (SQLException e) {
} finally {
try {
ps.close();
conn.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "关闭数据连接时出错!");
e.printStackTrace();
}
}
}
public void update(List list) {
Connection conn = JDBConnection.getConn();
PreparedStatement ps = null;
Iterator it = list.iterator();
int id = 0;
int col = 0;
String value = "";
String str = "";
try {
while (it.hasNext()) {
ChangedProduct ch = (ChangedProduct) it.next();
id = ch.getId();
col = ch.getCol();
value = ch.getValue();
switch (col) {
case 1:
str = "update justin_jtable_product set product_name=? where product_id=?";
break;
case 2:
str = "update justin_jtable_product set product_desc=? where product_id=?";
break;
case 3:
str = "update justin_jtable_product set product_status=? where product_id=?";
}
ps = conn.prepareStatement(str);
ps.setString(1, value);
ps.setInt(2, id);
ps.executeUpdate();
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "修改数据时出错!");
e.printStackTrace();
} finally {
try {
ps.close();
conn.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "关闭数据连接时出错!");
e.printStackTrace();
}
}
}
}
七:
package product;
public class DaoFactory {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
synchronized public static DaoInterface getDao(){
DaoInterface dao=null;
if(dao==null){
dao=new DaoImpl();
return dao;
}
return dao;
}
}
八:
package product;
public class ChangedProduct {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
private int id;
private int col;
private String value;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
}
九:
package product;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
public class ChangeEvent implements TableModelListener {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
/**
* 监听table被改动的事件,只要目的是用来记录被修改过的值,
* 这样做可以一次任意行的修改值,修改一个单元格的值就记录一次,
* 主要记录id,新值,烈数.
*/
ProductTableModel model = null;
public ChangeEvent(ProductTableModel model) {
this.model = model;
}
List list = model.getChangeList();
int id = 0;
String value = "";
public void tableChanged(TableModelEvent arg0) {
int row = arg0.getFirstRow();
int col = arg0.getColumn();
if (col != -1) {
ChangedProduct cp = new ChangedProduct();
id = ((Integer) model.getValueAt(row, 0)).intValue();
if (id != 0) {
value = model.getValueAt(row, col).toString();
cp.setId(id);
cp.setCol(col);
cp.setValue(value);
list.add(cp);
}
}
}
}
相关推荐
在这个详细的JTable使用例子中,我们主要探讨如何利用Java Swing组件JTable来展示、操作数据库中的数据。JTable是Swing GUI中用于显示和编辑表格数据的重要组件,它提供了丰富的功能,包括添加、删除和修改表格中的...
总的来说,这个"JTable 练习例子exa"涵盖了`JTable`的基本使用和数据绑定,以及如何从外部数据源(如SQL数据库)获取数据并显示在表格中。通过这个练习,开发者可以深入理解`JTable`的工作原理,并掌握在实际项目中...
本文档通过一个具体的例子展示了如何在Java Swing程序中使用`JTable`与SQL Server 2000数据库进行交互。通过构建自定义的数据模型,不仅可以实现数据展示,还可以方便地进行数据库操作。这种方式非常适合开发基于...
**Microsoft Access数据库操作例子** Microsoft Access是一款由微软公司开发的关系型数据库管理系统(RDBMS),它结合了数据库管理和用户友好的图形用户界面(GUI)工具,使得非编程人员也能创建和管理复杂的数据库...
数据库管理工具GUI例子(Java Swing)是利用Java的Swing库构建的一种图形用户界面应用程序,主要用于简化数据库的交互和管理。在IT领域,GUI(图形用户界面)为用户提供直观、友好的操作方式,而Java Swing作为Java的...
在Java的Swing库中,`JTable`是用于创建数据网格视图的重要组件,它允许用户以表格的形式展示和操作数据。`JTable`在GUI应用中非常常见,尤其适用于展示结构化数据,比如数据库记录或者报表。在这个例子中,我们将...
### JTable 实用小例子详解 #### 一、概述 本示例主要展示了如何使用 Java Swing 中的 `JTable` 组件来实现一个简单的表格应用,包括如何添加、删除数据等基本操作。这对于初学者来说是非常有用的参考资料。 ####...
在这个特定的例子中,我们看到如何使用 Swing 来实现与 SQL Server 2000 数据库的交互,包括基本的增、删、查、改操作。首先,我们需要了解 Swing 的组件和数据库操作的基础知识。 在代码中,`data` 类继承自 `...
这个例子对于初学者理解Java数据库操作、Swing GUI编程以及数据库在实际应用中的角色非常有帮助。同时,它也适合有一定经验的开发者参考,快速构建类似的库存管理系统。通过学习和实践,我们可以提高在Java环境中...
下面是一个简单的例子,展示了如何使用`JTable`和`DefaultTableModel`: ```java DefaultTableModel model = new DefaultTableModel(new Object[]{"姓名", "年龄"}, 0); JTable table = new JTable(model); ...
它提供了丰富的组件,其中之一就是JTable,这是一个强大的组件,用于展示二维数据集,并允许用户进行交互操作。在"swing中JTable的简单使用"这个主题中,我们将深入探讨如何在Java Swing应用中有效地使用JTable。 ...
Java中的`JTable`是Swing库中的一个关键组件,...这个实例提供了一些基本操作的例子,帮助开发者理解和应用`JTable`。通过深入研究和实践,你可以进一步掌握其高级特性,如数据过滤、自定义绘制和复杂的数据绑定等。
标准三层结构。...通过读取外部.properties配置文件获取数据库连接字符串连接数据库并进行数据库操作。 附有详细的说明,我的日食项目直接导入。 赠送3752条中英文对照句子,这些句子相信会成为很多人座右铭。
同时,JTable还可以与数据库连接,动态加载和保存数据,提供强大的数据交互功能。 总的来说,Java的JTable组件是一个功能丰富的组件,能够满足各种复杂的数据展示和操作需求。通过自定义渲染器、编辑器、模型以及...
在这个例子中,`toggleColumnVisibility`方法检查列是否已经存在于`TableColumnModel`中,然后执行相应的操作。记住,`removeColumn`和`addColumn`都会改变列的顺序,因此在隐藏和显示列时需要谨慎处理。 至于标签...
以下是一个具体的例子,展示了如何使用Eclipse连接到一个Microsoft Access数据库,并执行SQL查询来获取数据。 首先,我们需要引入必要的Java SQL库,这通常在`import`语句中完成。在提供的代码片段中,我们看到`...
在这个例子中,URL(Uniform Resource Locator)是`jdbc:mysql://localhost:3306/web`,其中`jdbc:mysql`指定了数据库类型是MySQL,`localhost`是服务器地址,`3306`是MySQL服务默认的端口号,`web`是数据库名。...
这个项目的实施涵盖了Java GUI开发、数据库操作和用户验证等多个方面,是学习和实践Java应用程序开发的好例子。通过完成这个项目,开发者可以提升对Java Swing、JDBC和数据库操作的理解,同时增强实际问题解决能力。
本示例代码演示了如何使用Java连接到SQL Server数据库并进行基本的增删改查操作,非常适合Java初学者学习。我们将深入解析其中的关键知识点: 1. **JDBC(Java Database Connectivity)**:JDBC是Java API,用于与...
本示例通过一个名为"MyJDBCTest.java"的Java程序展示了如何连接到Oracle数据库,并执行基本的SQL操作,如查询、插入、删除和更新。 首先,Java连接Oracle数据库通常需要JDBC(Java Database Connectivity)驱动。...