import javax.swing.table.AbstractTableModel;  

 public class MyTable extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
Object[][] p = {
{ "11", "Taipei", new Integer(66), new Integer(32),
new Integer(98), new Boolean(false), new Boolean(false) },
{ "22", "ChiaYi", new Integer(85), new Integer(69),
new Integer(154), new Boolean(true), new Boolean(false) },
{ "33", "ChiaYi", new Integer(85), new Integer(69),
new Integer(154), new Boolean(true), new Boolean(false) },
{ "44", "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];
// return null;
} public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
// return null;
} 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); //此处不能有,否则会陷入对自身的调用,导致内存溢出。
}
}
 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; //tableModel
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, 100)); //设置表格默认展现视图大小 JScrollPane s = new JScrollPane(table); //滚动条
f.getContentPane().add(s, BorderLayout.CENTER); label = new JLabel("修改字段位置:");
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);
}
});
} @Override
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();
}

最新文章

  1. Play Framework 完整实现一个APP(十四)
  2. 缓存淘汰算法--LRU算法
  3. Authentication of Django
  4. 当C#中带有return的TryCatch代码遇到Finally时代码执行顺序
  5. android 查找某个特定文件后缀名
  6. JS传中文到后台需要的处理
  7. Java 循环语句之多重循环
  8. 关于iOS APP中网络层的设计
  9. 数据库 数据库SQL语句五
  10. 【翻译】在Visual Studio中使用Asp.Net Core MVC创建第一个Web Api应用(二)
  11. jQuery事件绑定、解绑、命名空间
  12. Java之面向对象例子(二)
  13. 使用angular4和asp.net core 2 web api做个练习项目(一)
  14. 【O】VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空
  15. Hive导入HDFS/本地数据
  16. 跨域问题jsonp
  17. scrapy中的request
  18. 生成透视列之for xml path
  19. mysql数据库操作记录持续更新...
  20. ssh-keygen Linux 免密登录

热门文章

  1. scrapy框架之comand line tool
  2. 济南学习 Day 5 T1 晚
  3. 无记录时显示gridview表头,并增加一行显示“没有记录”【绑定SqlDataSource控件时】
  4. Android 网络编程之HttpURLConnection运用
  5. 使用 ftrace 调试 Linux 内核,第1部分
  6. C51单片机头文件和启动文件
  7. python多线程(三)
  8. CentOS6、CentOS7配置Base源和epel源
  9. JDBC自定义连接池
  10. Java I/O概述