Jtable加入复选框

 

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 --------------------------------

 * =====================================================快乐小神仙

 * 

 * 

 * 

 * 一、VectorArrayList讲解

 * 用到了向量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();

}

}

你可能感兴趣的:(Swing)