1. 程式人生 > >swing_AbstractTableModel 創建表格

swing_AbstractTableModel 創建表格

ted obj getclass [] over listener rep 處理 dell

 1 import javax.swing.table.AbstractTableModel;  
 2 
 3 public class MyTable extends AbstractTableModel {  
 4     /** 
 5      *  
 6      */  
 7     private static final long serialVersionUID = 1L;  
 8     Object[][] p = {  
 9             { "11", "Taipei", new Integer(66), new Integer(32),  
10 new Integer(98), new Boolean(false), new Boolean(false) }, 11 { "22", "ChiaYi", new Integer(85), new Integer(69), 12 new Integer(154), new Boolean(true), new Boolean(false) }, 13 { "33", "ChiaYi", new Integer(85), new Integer(69),
14 new Integer(154), new Boolean(true), new Boolean(false) }, 15 { "44", "ChiaYi", new Integer(85), new Integer(69), 16 new Integer(154), new Boolean(true), new Boolean(false) } 17 }; 18 String[] n = { "姓名", "居住地", "語文", "數學", "總分", "及格" };
19 20 public int getColumnCount() { 21 return n.length; 22 } 23 24 public int getRowCount() { 25 return p.length; 26 } 27 28 public String getColumnName(int col) { 29 return n[col]; 30 } 31 32 public Object getValueAt(int row, int col) { 33 return p[row][col]; 34 // return null; 35 } 36 37 public Class getColumnClass(int c) { 38 return getValueAt(0, c).getClass(); 39 // return null; 40 } 41 42 public boolean isCellEditable(int rowIndex, int columnIndex) { 43 return true; 44 } 45 46 public void setValueAt(Object value, int row, int col) { 47 p[row][col] = value; 48 fireTableCellUpdated(row, col); // 該方法觸發TableModelEvent 事件,tableChanged()會進行相應的處理 49 } 50 51 public void mySetValueAt(Object value, int row, int col) { 52 p[row][col] = value; 53 //fireTableCellUpdated(row, col); //此處不能有,否則會陷入對自身的調用,導致內存溢出。 54 } 55 }

 1 import java.awt.BorderLayout;  
 2 import java.awt.Dimension;  
 3 import java.awt.event.WindowAdapter;  
 4 import java.awt.event.WindowEvent;   
 5 import javax.swing.DefaultCellEditor;  
 6 import javax.swing.JComboBox;  
 7 import javax.swing.JFrame;  
 8 import javax.swing.JLabel;  
 9 import javax.swing.JScrollPane;  
10 import javax.swing.JTable;  
11 import javax.swing.event.TableModelEvent;  
12 import javax.swing.event.TableModelListener;  
13   
14 public class TableEventHandle implements TableModelListener {  
15     JTable table = null;  
16     MyTable mt = null;  //tableModel
17     JLabel label = null;  
18   
19     public TableEventHandle() {  
20         JFrame f = new JFrame();  
21         mt = new MyTable();  
22         mt.addTableModelListener(this);  
23         table = new JTable(mt);
24         
25         JComboBox c = new JComboBox();  
26         c.addItem("Taipei");  
27         c.addItem("ChiaYi");  
28         c.addItem("HsinChu");  
29         table.getColumnModel().getColumn(1)  
30                 .setCellEditor(new DefaultCellEditor(c)); 
31         
32         table.setPreferredScrollableViewportSize(new Dimension(550, 100)); //設置表格默認展現視圖大小 
33         
34         
35         JScrollPane s = new JScrollPane(table);  //滾動條
36         f.getContentPane().add(s, BorderLayout.CENTER);
37         
38         
39         label = new JLabel("修改字段位置:");   
40         f.getContentPane().add(label, BorderLayout.SOUTH);
41         
42         f.setTitle("TableEventHandle");  
43         f.pack();  
44         f.setVisible(true);  
45         f.addWindowListener(new WindowAdapter() {  
46             public void windowClosing(WindowEvent e) {  
47                 System.exit(0);  
48             }  
49         });  
50     } 
51     
52   @Override
53     public void tableChanged(TableModelEvent e) {  
54         int row = e.getFirstRow();  
55         int column = e.getColumn();  
56         
57         label.setText("修改字段位置:" + (row + 1) + "行" + (column + 1) + "列");  
58         
59         boolean cheat = ((Boolean) (mt.getValueAt(row, 6))).booleanValue();  
60         int grade1 = ((Integer) (mt.getValueAt(row, 2))).intValue();  
61         int grade2 = ((Integer) (mt.getValueAt(row, 3))).intValue();  
62         
63         int total = grade1 + grade2; 
64         
65         
66         
67         if (cheat) {  
68             if (total > 120)  
69                 mt.mySetValueAt(new Integer(119), row, 4); //只更新值,不觸發事件。改為mt.setValueAt()也可。但會不斷觸發事件,java應該做了相應處理,否則會內存溢出。  
70             else  
71                 mt.mySetValueAt(new Integer(total), row, 4);  
72                 mt.mySetValueAt(new Boolean(false), row, 5);  
73         } else {  
74             if (total > 120)  
75                 mt.mySetValueAt(new Boolean(true), row, 5);  
76             else  
77                 mt.mySetValueAt(new Boolean(false), row, 5);  
78                 mt.mySetValueAt(new Integer(total), row, 4);  
79         } 
80         
81 
82         
83         table.repaint();  
84     } 
85   
86   
87   
88     public static void main(String args[]) {  
89           new TableEventHandle();  
90     }
91 
92  

swing_AbstractTableModel 創建表格