swing JTable学习(七)—TableModelListener

TableEventHandle 实现TableModelListener接口,实现如下方法:tableChanged(TableModelEvent e)。该方法由fireTableCellUpdated(row, col)触发。将fireTableCellUpdated(row, col)放到setValueAt(),就可以做到,当表格的值有改变时,调用fireTableCellUpdated,触发TableModelEvent事件,然后做相应处理。

package tableModelListenerTest;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

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); //只更新值,不触发事件。改为mt.setValueAt()也可。但会不断触发事件,java应该做了相应处理,否则会内存溢出。
			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();
	}
}
</pre><pre class="java" name="code">



package tableModelListenerTest;

import javax.swing.table.AbstractTableModel;

public class MyTable extends AbstractTableModel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	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); // 该方法触发TableModelEvent 事件,tableChanged()会进行相应的处理
	}

	public void mySetValueAt(Object value, int row, int col) {
		p[row][col] = value;
		//fireTableCellUpdated(row, col);  //此处不能有,否则会陷入对自身的调用,导致内存溢出。
	}
}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值