import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumnModel;
/**
*
* ----------------------------------------Table Demo4 --------------------------------
* =====================================================快乐小神仙
*
*
*
* 一、Vector与ArrayList讲解
* 用到了向量Vector 可以参照ArrayList的用法 ,他们用法基本一样。
* 区别: Vector是线性安全的,还有连个空间的增长长度方式不一样。
* Vecrot是每次增加原来的一倍,ArrayList是每次增加原来的一半。
*
*
*二、本例: Table demo的例子:-------在表格中添加 单选按钮,和复选框
*
* 讲解:
*
* 1、用JFrame,JPanel,JButton 写一个简单的界面
*
* 2、 写一个内部类,让此类继承AbstractTableModel
*
* 3、定义一个内部类的全局变量Vector vector;
*
* 4、写一个构造方法 :初始化Vector
*
* 5、定义一个内部类的全局变量,String[] columnNames = {}; 这是表格的列名
*
* 6、实现方法getColumnCount(): columnNames.length;
*
* 7、实现方法getRowCount(): vector.size;
*
* 8、实现getValueAt(): vector.get(row).get(col);
*
* 9、写一个往Vector中添加数据的方法 addRow(),这个方法是子类所特有的,其中方法名可以任意
*
* 10、在外部类定义全局变量 private TableModel model和表格 private JTable table;
*
* 11、在外部类中的构造方法初始化model 和table ,其中 初始化table是这样初始化的:table = new JTable(model);
*
* 12、在构造方法定义一个滚动面板,将表格添加到面板中,要不然表格的表头是不会显示的:
* JScrollPane pane =new JScrollPane(table);
*
* 13、然后将pane添加到JPanel中。
*
* 14、运行程序...
*
* 15、你会看见表头并不是你所想看到的样子,这是由于model是调用了父类AbstractTableModel中的方法getColumnName(),
* 所以要修改表头的话,只能重写父类中的非抽象方法getColumnName(),覆盖父类中的方法
*
* 16、 实现添加按钮的方法,再次我直接用匿名类实现
*
* 17、运行程序,你会发觉“是否可用”的显示方法并不是你所想要的。
*
* 18、要实现“是否可用”用复选框的形式进行显示,那么就需要重写父类中的getClass()方法
*
* 19、运行程序,你会发觉复选框修改不了,所以还需要修改两个方法
*
* 20、重写父类的方法 isCellEditAble()------让某些值可以进行修改
* setValueAt()-------是修改后的值生效。
*
* Table demo------------在表格中添加其他组件
* @author Administrator
*
*/
public class TableDemo4 {
private JFrame frame;
private JPanel panel;
private JButton addButton;
private JTable table;
private TableModel model;
public TableDemo4(){
frame = new JFrame("表格测试");
panel = new JPanel();
addButton = new JButton("添加");
/*
* 给按钮添加监听器
*/
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object[] data = {"张三","zhangsan",true};
model.addRow(data);
//强制刷新界面
table.updateUI();
}
});
model = new TableModel();
table = new JTable(model);
/*model = new TableModel();
table = new JTable(model);
String[]d = {"张三","李四","王五"};
JComboBox com = new JComboBox(d);
TableColumnModel tcm = table.getColumnModel();//得到TableModel()
tcm.getColumn(0).setCellEditor(new DefaultCellEditor(com));
tcm.getColumn(0).setPreferredWidth(50);
tcm.getColumn(1).setPreferredWidth(100);
tcm.getColumn(2).setPreferredWidth(50);*/
JScrollPane pane = new JScrollPane(table);
panel.add(addButton);
panel.add(pane);
frame.add(panel);
frame.setVisible(true);
frame.setBounds(400,200,500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//model.addRow("1","zhangsan", true, "19");
//table.updateUI();
}
/**
*
* AbstractTableModel:中的抽象方法:
* getColumnCount(),getRowCount(),getValueAt():
* 当JTable调用方法updateUI()的时候,就会执行这些方法。
*
*
* updateUI()会把父类中的方法全部执行一遍
* @author Administrator
*
*/
public class TableModel extends AbstractTableModel{
private Vector vector = new Vector();
private String[] columnNames = {"用户名","密码","是否可用"};
/**
* ------------------------------------------------------
* 重写父类中的抽象方法
*
* 获得表格中的列数
*/
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
System.out.println("getColumnCount()");
return columnNames.length;
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
System.out.println("getRowCount()");
return vector.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
//vector.get(rowIndex);得到的是Object的对象
System.out.println("getValueAt()");
return ((Vector)vector.get(rowIndex)).get(columnIndex);
}
/**
* 抽象方法
* -----------------------------------------------------------
*/
/**
* 重写父类中非抽象的方法------覆盖父类中的方法
*/
public String getColumnName(int columnIndex) {
System.out.println("getColumnName");
return columnNames[columnIndex];
}
/**
* 重写父类中的方法=======获得输入数据的类型,实现复选框的显示
*/
public Class getColumnClass(int columnIndex){
return getValueAt(0,columnIndex).getClass();
}
/**
* 让表格中某些值可以进行修改
* return false,说明不能进行修改
*/
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
/**
* 重写父类中的方法=====实现表格的数据可操作
*/
public void setValueAt(Object value, int rowIndex, int columnIndex) {
//先删除,在添加
System.out.println("setValueAt()");
((Vector) vector.get(rowIndex)).remove(columnIndex);
((Vector) vector.get(rowIndex)).add(columnIndex,value);
this.fireTableCellUpdated(rowIndex, columnIndex);
}
/**
* 无参构造方法------初始化数据
*/
public TableModel(){
}
/**
* 往行中添加数据----这个方法名可以随意,由用户进行自行调用,
* 否则table.updateUI()是不会自动调用的
*/
public void addRow(Object[] data){
int size = data.length;
Vector v = new Vector();
for(int i=0; i
v.add(data[i]);
}
vector.add(v);
}
}
/**
* 程序的入口
*/
public static void main(String[] args){
new TableDemo4();
}
}