Java使用自定义的tableModel,设置可编辑方式

package com.han;

import java.awt.BorderLayout;
import java.util.Vector;

import javax.swing.JFrame;

/**
 * Provide a fixed column in a table.
 * 
 * <code><p>public boolean isCellEditable(int row, int column) {<p>
        return getModel().isCellEditable(convertRowIndexToModel(row),<p>
                                         convertColumnIndexToModel(column));<p>
    }<p>
    </code>
 *  so we can also directly rewrite the isCellEditable() in the table model.
 * 
 * @author Gaowen
 * 
 */

public class JTable4_Modified extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 805308369080023303L;

	public JTable4_Modified() {
		super();
		setTitle("提供行标题栏的表格");
		setBounds(100, 100, 500, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Vector<String> columnNameV = new Vector<String>();
		columnNameV.add("日期");
		for (int i = 1; i < 21; i++) {
			columnNameV.add("商品" + i);
		}
		Vector<Vector<Object>> tableValueV = new Vector<Vector<Object>>();
		for (int row = 1; row < 31; row++) {
			Vector<Object> rowV = new Vector<Object>();
			rowV.add(row);
			for (int col = 0; col < 20; col++) {
				rowV.add((int) (Math.random() * 1000));
			}
			tableValueV.add(rowV);
		}
		final MFixedColumnTable_Modified panel = new MFixedColumnTable_Modified(columnNameV,
				tableValueV, 1);
		getContentPane().add(panel, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JTable4_Modified frame = new JTable4_Modified();
		frame.setVisible(true);
	}
}

package com.han;

import java.awt.BorderLayout;
import java.util.Vector;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

/**
 * <code><p>public boolean isCellEditable(int row, int column) {<p>
        return getModel().isCellEditable(convertRowIndexToModel(row),<p>
                                         convertColumnIndexToModel(column));<p>
    }<p>
    </code>
 *  so we can also directly rewrite the isCellEditable() in the table model.
 * 
 * @author HAN
 *
 */
public class MFixedColumnTable_Modified extends JPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = -8001758880985479654L;
	private Vector<String> columnNameV; // declare the table column name vector
	private Vector<Vector<Object>> tableValueV; // declare the table value
												// vector
	private int fixedColumn = 1; // the fixed column number
	private JTable fixedColumnTable;
	private FixedColumnTableModel fixedColumnTableModel;
	private JTable floatingColumnTable;
	private FloatingColumnTableModel floatingColumnTableModel;

	private class FixedColumnTableModel extends AbstractTableModel { // inner
																		// class

		/**
		 * 
		 */
		private static final long serialVersionUID = 3935656415101599023L;

		@Override
		public int getRowCount() {
			// TODO Auto-generated method stub
			return tableValueV.size();
		}

		@Override
		public int getColumnCount() {
			// TODO Auto-generated method stub
			return fixedColumn;
		}

		@Override
		public Object getValueAt(int rowIndex, int columnIndex) {
			// TODO Auto-generated method stub
			return tableValueV.get(rowIndex).get(columnIndex);
		}

		@Override
		public String getColumnName(int columnIndex) {
			return columnNameV.get(columnIndex);
		}
	}

	private class FloatingColumnTableModel extends AbstractTableModel {
		/**
		 * 
		 */
		private static final long serialVersionUID = -2481466672947191281L;
		
		@Override
		public boolean isCellEditable(int row, int column) {
			return true;
		}

		@Override
		public int getRowCount() {
			return tableValueV.size();
		}

		@Override
		public int getColumnCount() {
			return columnNameV.size() - fixedColumn;
		}

		@Override
		public Object getValueAt(int rowIndex, int columnIndex) {
			return tableValueV.get(rowIndex).get(columnIndex + fixedColumn);
		}

		@Override
		public String getColumnName(int columnIndex) {
			return columnNameV.get(columnIndex + fixedColumn);
		}
	}

	private class MListSelectionListener implements ListSelectionListener {
		boolean isFixedColumnTable = true;

		public MListSelectionListener(boolean isFixedColumnTable) {
			this.isFixedColumnTable = isFixedColumnTable;
		}

		@Override
		public void valueChanged(ListSelectionEvent e) {
			// TODO Auto-generated method stub
			if (isFixedColumnTable) {
				int row = fixedColumnTable.getSelectedRow();
				floatingColumnTable.setRowSelectionInterval(row, row);
			} else {
				int row = floatingColumnTable.getSelectedRow();
				fixedColumnTable.setRowSelectionInterval(row, row);
			}
		}
	}

	public MFixedColumnTable_Modified(Vector<String> columnNameV,
			Vector<Vector<Object>> tableValueV, int fixedColumn) {
		super();
		setLayout(new BorderLayout());
		this.columnNameV = columnNameV;
		this.tableValueV = tableValueV;
		this.fixedColumn = fixedColumn;
		// create fixedColumnTable
		fixedColumnTableModel = new FixedColumnTableModel();
		fixedColumnTable = new JTable(fixedColumnTableModel);
		ListSelectionModel fixed = fixedColumnTable.getSelectionModel();
		fixed.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		fixed.addListSelectionListener(new MListSelectionListener(true));
		// create floatingColumnTable
		floatingColumnTableModel = new FloatingColumnTableModel();
		floatingColumnTable = new JTable(floatingColumnTableModel);
		floatingColumnTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		ListSelectionModel floating = floatingColumnTable.getSelectionModel();
		floating.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		floating.addListSelectionListener(new MListSelectionListener(false));
		// create scrollPane
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,
				fixedColumnTable.getTableHeader());
		JViewport viewport = new JViewport();
		viewport.setView(fixedColumnTable);
		viewport.setPreferredSize(fixedColumnTable.getPreferredSize());
		scrollPane.setRowHeaderView(viewport); // viewport 视口
		scrollPane.setViewportView(floatingColumnTable);
		add(scrollPane, BorderLayout.CENTER);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值