TableColumnModel本身是一個接口,里面定義了許多與表格的行和列有關的方法,通常情況下我們不會直接實現此接口。
而是利用JTable里面的getColumnModel()方法取得TableColumnModel對象,然后利用此對象對字段進行設置
使用TableColumnModel類的getColumn()方法可以獲得TableColumn對象。
TableColumn對象可以設置表中字段的寬度、某行的表頭,設置輸入較復雜的數據類型,
這里使用TableColumn提供的setCellEditor()
package test;
import java.awt.Dimension;
import java.awt.BorderLayout;
import javax.swing.table.AbstractTableModel;
import javax.swing.JFrame;
import javax.swing.table.AbstractTableModel;
import javax.swing.JTable;
import javax.swing.JComboBox;
import javax.swing.DefaultCellEditor;
import javax.swing.JScrollPane;
public class TableColumnModelTest{
public TableColumnModelTest(){
JFrame frame = new JFrame();
MyTable mt = new MyTable();
JTable table = new JTable(mt);//利用MyTable來建立JTable
JComboBox combox = new JComboBox();//建立一個JComboBox對象
//在JComboBox對象中增加三個條目Taipei、ChiaYi、HsinChu
combox.addItem("Taipei");
combox.addItem("ChiaYi");
combox.addItem("HsinChu");
//通過JTable先取得TableColumnModel對象,再由TableColumnModel對象的getColumn()方法取得TableColumn
//TableColumn類可以針對每一行相應的列做具體的設置
table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(combox));
table.setPreferredScrollableViewportSize(new Dimension(550,30));
JScrollPane scrollPane = new JScrollPane(table);
frame.getContentPane().add(scrollPane,BorderLayout.NORTH);
frame.setTitle("TableColumnModelTest");
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args){
new TableColumnModelTest();
}
}
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();
}
//復寫AbstractTableModel的isCellEditable()方法,是表格中的列可以編輯
public boolean isCellEditable(int rowIndex,int columnIndex){
return true;
}
//復寫AbstractTableModel的setValueAt()方法,是表格中的列修改后可以留在表格
public void setValueAt(Object value,int row,int col){
p[row][col] = value;
fireTableCellUpdated(row,col);
}
}