监听表格数据变化
终于进入到JTable的重头戏了,监听在任何Java项目中都是非常重要的,监听带来的一系列的操作也有时候非常复杂
在Excel表格中,当表格中的一个单元格的数据发生变化时,与之相关的数据也会同时发生变化,这就设计到表格监听器的知识。JTable的事件大致均针对表格内容的操作处理,包括字段内容改变、列数增加或减少、行数增加或减少、表格的结构改变等。这些事件称为TableModelEvent事件。要处理TableModelEvent事件必须实现TableModelListener,此接口定义了一个方法,即TableChanged();
接下来这个实例,主要用于创建一个表格,通过对这个表格中的某个单元格数据进行修改,使得与之相关的单元格数据反生变化。
例子如下:
package com.acconsys.swing.chapter14; import java.awt.BorderLayout; /** * 展示如何处理TableModelEvent事件 * * @author Administrator * */ public class Test9 implements TableModelListener { JTable table = null; MyTable9 my = null; public Test9() { JFrame f = new JFrame(); my = new MyTable9(); my.addTableModelListener(this); table = new JTable(my); table.setPreferredScrollableViewportSize(new Dimension(550, 30)); JScrollPane s = new JScrollPane(table); f.getContentPane().add(s, BorderLayout.CENTER); f.setTitle("表格事件处理"); f.pack(); f.setVisible(true); f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } @Override public void tableChanged(TableModelEvent e) { /** * 处理表格数据变化事件 */ // 获取所选数据的行数 int row = e.getFirstRow(); // 获得此行第二列的值 int grade1 = ((Integer) my.getValueAt(row, 1)).intValue(); // 获取此行第3列的值 int grade2 = ((Integer) my.getValueAt(row, 2)).intValue(); // 将两次获得的值进行叠加 int total = grade1 + grade2; // 将变化的值赋给第4列 my.mySetValueAt(new Integer(total), row, 3); // 系统重新绘制表格 table.repaint(); } public static void main(String[] args) { new Test9(); } } class MyTable9 extends AbstractTableModel { // 使用AbstractTableModel来创建表格模型 Object[][] p = { { "王鹏", new Integer(91), new Integer(1949), new Integer(1910) }, { "朱学莲", new Integer(82), new Integer(1969), new Integer(1510) }, { "梅婷", new Integer(47), new Integer(1957), new Integer(1040) }, { "赵龙", new Integer(61), new Integer(1957), new Integer(1180) }, { "李兵", new Integer(90), new Integer(1987), new Integer(1770) }, }; String[] n = { "姓名", "工号", "出生年月", "薪水" }; @Override public int getRowCount() { return p.length; } @Override public int getColumnCount() { return n.length; } @Override public Object getValueAt(int row, int col) { return p[row][col]; } @Override public String getColumnName(int col) { return n[col]; } @Override public Class<?> getColumnClass(int c) { return getValueAt(0, c).getClass(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { // 判断单元格是否可以编辑 return true; } @Override public void setValueAt(Object value, int row, int col) { p[row][col] = value; fireTableCellUpdated(row, col); } public void mySetValueAt(Object value, int row, int col) { p[row][col] = value; } }
运行结果及操作说明
刚开始的时候工号+出生年月!=薪水
当在工号或出生年月修改值,按Enter后,工号+出生年月=薪水。