转自:http://blog.youkuaiyun.com/silence1214/article/details/6118054
JTable中,显示checkbox以及更改选中状态
继续做完的JTable的来学习和实践,默认情况下构造的JTable,内容是死的,不能更改,可以通过实现3个TableModel来作为JTable构造时候的参数穿进去,就可以灵活的对JTable就行构造了,来看下我这个JTable的例子,带上注释就好了。
- /**
- *
- */
- package com.baseframework.core.ui.component;
- import javax.swing.JTable;
- import javax.swing.table.AbstractTableModel;
- import javax.swing.table.TableColumn;
- /**
- * @author sunyanan
- *
- * 是整体框架的左侧树状导航,也是任务的开始设置地方,整体返回一个JTable的实例
- *
- */
- public class LeftTableNavigation {
- // 单例一下
- private LeftTableNavigation() {};
- private static LeftTableNavigation l = new LeftTableNavigation();
- public static LeftTableNavigation getInstance() {
- return l;
- }
- // 左侧导航JTable的唯一实例
- private JTable table;
- /**
- * 主要的产生导航Table的方法
- *
- * @return JTable的实例
- */
- public JTable process() {
- if(table == null) {
- table = new JTable(new LinkTableMode());
- }
- // 设置表头不伸缩模式:如果手工调整一个表头栏目,其他的不会跟随着变的
- table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
- // 设置表头的宽度
- for(int i = 0; i < table.getColumnCount(); ++i) {
- TableColumn tc = table.getColumnModel().getColumn(i);
- tc.setPreferredWidth(table.getColumnName(i).length() * 15);
- }
- return table;
- }
- }
- class LinkTableMode extends AbstractTableModel {
- private static final long serialVersionUID = 1016386589304301730L;
- // 常量配置区
- private String[] tableHeader = {"初始关键词&列表", "采相关词", "采网址", "采内容", "发内容"};
- private Object[][] data = {{"初始关键词&列表", false, true, true, true}};
- @Override
- public int getColumnCount() {
- return tableHeader.length;
- }
- @Override
- public int getRowCount() {
- return data.length;
- }
- @Override
- public Object getValueAt(int rowIndex, int columnIndex) {
- return data[rowIndex][columnIndex];
- }
- @Override
- public String getColumnName(int column) {
- return tableHeader[column];
- }
- /**
- * 默认情况下这个方法不用重新实现的,但是这样就会造成如果这个列式boolean的类型,就当做string来处理了
- * 如果是boolean的类型那么用checkbox来显示
- */
- @Override
- public Class<?> getColumnClass(int columnIndex) {
- return getValueAt(0, columnIndex).getClass();
- }
- /**
- * 来判断当前选中的单元格是够可以被编辑,因为我是从第二列需要可以编辑的,也就是复选框的列可以编辑的,故
- * 我有个逻辑判断的哈
- */
- @Override
- public boolean isCellEditable(int rowIndex, int columnIndex) {
- if(columnIndex > 0) return true;
- return false;
- }
- /**
- * 如果这个列可以被编辑的话,但是没有这个方法,当回车后是恢复之前的内容的,只有在这个地方通过对新值的
- * 获取然后再设置进去才会被更改的。
- */
- @Override
- public void setValueAt(Object value, int rowIndex, int columnIndex) {
- System.out.println("[row: "+ rowIndex + ", column: " + columnIndex + ", value: " + value + " ]");
- data[rowIndex][columnIndex] = value;
- }
- }