Skip to content Skip to footer

JTable的事件处理

JTable的事件处理 在前面的介绍中,我们了解了数种在不同组件上的事件处理。同样,在JTable的事件大致均针对表格内容的异操作处理,包括字段内容改变,列数增加或减少,行数增加或减少,或是表格的结构改变等等。这些事件我们称为TableModelEvent事件。要处理TableModelEvent事件我们必须实现TableModelListener界面,此界面定义了一个方法,那就是tableChanged(),为了处理这些事件的种种情况,在AbstractTableModel类中提供了下列方法来提示TableModelListener:表格内容已经改动了,如下所示: 1.fireTableCellUpdated():发出表格中的某一个字段已经更改的事件信息。 2.fireTableChanged():发出表格已经改动的事件信息。 3.fireTableDataChanged():发出表格中的某字段已经更改的事件信息。 4.fireTableRowsDeleted():发出表格中的某几行已经删除的事件信息。 5.fireTableRowsInserted():发出表格中的已经新增某几行的事件信息。 6.fireTableRowsUpdated():发出表格中的某几行已经修改的事件信息。 7.fireTableStructureChanged():发出表格结构已经改变的事件信息,这里指的结构改变可能包括表格的列数已经改变。 在知道在表格中可能发生的事件后,我们要如何拦截这些事件的信息呢?在AbstractTableModel类中提供了一个注册listener的方法:addTableModelListener().在加入TableModelListener之后,我们就可以依照不同的事件做不同的处理了。 先来看看下面的例子吧,这个例子主要是更改本章的ColumnModelTest.java范例,再加上一些功能。在这个范例中,我们针对用户对表格所做的修改加以处理,如果改的项目是数字,包括“语文”,“数学”字段,则我们直接将修改的值累加至"总分"字段,并检查其是否及格且在“及格”字段作修改。import javax.swing.table.AbstractTableModel;import javax.swing.event.*;import javax.swing.table.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;public class TableEventHandle implements TableModelListener{ JTable table = null; MyTable mt = null; JLabel label = null; //显示修改字段位置 public TableEventHandle() { JFrame f = new JFrame(); mt=new MyTable(); mt.addTableModelListener(this); table=new JTable(mt); JComboBox c = new JComboBox(); c.addItem("Taipei"); c.addItem("ChiaYi"); c.addItem("HsinChu"); table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(c)); table.setPreferredScrollableViewportSize(new Dimension(550, 30)); JScrollPane s = new JScrollPane(table); label = new JLabel("修改字段位置:"); f.getContentPane().add(s, BorderLayout.CENTER); f.getContentPane().add(label, BorderLayout.SOUTH); f.setTitle("TableEventHandle"); f.pack(); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); label.setText("修改字段位置:"+(row+1)+" 行 "+(column+1)+" 列"); boolean cheat =((Boolean)(mt.getValueAt(row,6))).booleanValue(); int grade1=((Integer)(mt.getValueAt(row,2))).intValue(); int grade2=((Integer)(mt.getValueAt(row,3))).intValue(); int total = grade1+grade2; if(cheat) { if(total > 120) mt.mySetValueAt(new Integer(119),row,4); else mt.mySetValueAt(new Integer(total),row,4); mt.mySetValueAt(new Boolean(false),row,5); } else { if(total > 120) mt.mySetValueAt(new Boolean(true),row,5); else mt.mySetValueAt(new Boolean(false),row,5); mt.mySetValueAt(new Integer(total),row,4); } table.repaint(); } public static void main(String args[]) { new TableEventHandle(); }}class MyTable extends AbstractTableModel { Object[][] p = { {"阿呆", "Taipei",new Integer(66), new Integer(32), new Integer(98), new Boolean(false),new Boolean(false)}, {"阿瓜", "ChiaYi",new Integer(85), new Integer(69), new Integer(154), new Boolean(true),new Boolean(false)}}; String[] n = {"姓名","居住地","语文","数学","总分","及格"}; public int getColumnCount() { return n.length; } public int getRowCount() { return p.length; } public String getColumnName(int col) { return n[col]; } public Object getValueAt(int row, int col) { return p[row][col]; } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); }public boolean isCellEditable(int rowIndex, int columnIndex) {return true; } 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; }}