JTable09

来源:互联网 发布:软件著作权维持费用 编辑:程序博客网 时间:2024/06/03 18:30
import java.awt.*;import java.util.*;import javax.swing.*;public class Answer_2109 extends JFrame {public static void main(String args[]) {try {Answer_2109 frame = new Answer_2109();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}public Answer_2109() {super();setTitle("提供行标题栏的表格");setBounds(100, 100, 500, 375);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Vector columnNameV = new Vector();columnNameV.add("日期");columnNameV.add("营业额");// 添加一个日营业额列for (int i = 1; i < 21; i++) {columnNameV.add("商品" + i);}Vector tableValueV = new Vector();for (int row = 1; row < 31; row++) {Vector rowV = new Vector();rowV.add(row);int sum = 0;// 日营业额for (int col = 0; col < 20; col++) {int value = (int) (Math.random() * 1000);rowV.add(value);sum += value;// 累计日营业额}rowV.insertElementAt(sum, 1);// 插入日营业额数据tableValueV.add(rowV);}final MFixedColumnTable panel = new MFixedColumnTable(columnNameV,tableValueV, 2);// 修改固定列数量getContentPane().add(panel, BorderLayout.CENTER);//}}
import java.awt.*;import java.util.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.table.*;public class MFixedColumnTable extends JPanel {private JTable fixedColumnTable;// 固定列表格对象private FixedColumnTableModel fixedColumnTableModel;// 固定列表格模型对象private JTable floatingColumnTable;// 移动列表格对象private FloatingColumnTableModel floatingColumnTableModel;// 移动列表格模型对象private Vector<String> columnNameV;// 表格列名数组private Vector<Vector<Object>> tableValueV;// 表格数据数组private int fixedColumn = 1;// 固定列数量public MFixedColumnTable(Vector<String> columnNameV,Vector<Vector<Object>> tableValueV, int fixedColumn) {super();setLayout(new BorderLayout());this.columnNameV = columnNameV;this.tableValueV = tableValueV;this.fixedColumn = fixedColumn;fixedColumnTableModel = new FixedColumnTableModel();// 创建固定列表格模型对象fixedColumnTable = new JTable(fixedColumnTableModel);// 创建固定列表格对象ListSelectionModel fixed = fixedColumnTable.getSelectionModel();// 获得选择模型对象fixed.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 选择模式为单选fixed.addListSelectionListener(new MListSelectionListener(true));// 添加行被选中的事件监听器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));// 添加行被选中的事件监听器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);// 将视口添加到滚动面版的标题视口中scrollPane.setViewportView(floatingColumnTable);// 将可移动表格添加到默认视口add(scrollPane, BorderLayout.CENTER);//}private class FixedColumnTableModel extends AbstractTableModel {public int getColumnCount() {// 返回固定列的数量return fixedColumn;}public int getRowCount() {// 返回行数return tableValueV.size();}public Object getValueAt(int rowIndex, int columnIndex) {// 返回指定单元格的值return tableValueV.get(rowIndex).get(columnIndex);}@Overridepublic String getColumnName(int columnIndex) {// 返回指定列的名称return columnNameV.get(columnIndex);}}private class FloatingColumnTableModel extends AbstractTableModel {public int getColumnCount() {// 返回可移动列的数量return columnNameV.size() - fixedColumn;// 需要扣除固定列的数量}public int getRowCount() {// 返回行数return tableValueV.size();}public Object getValueAt(int rowIndex, int columnIndex) {// 返回指定单元格的值return tableValueV.get(rowIndex).get(columnIndex + fixedColumn);// 需要为列索引加上固定列的数量}@Overridepublic String getColumnName(int columnIndex) {// 返回指定列的名称return columnNameV.get(columnIndex + fixedColumn);// 需要为列索引加上固定列的数量}}private class MListSelectionListener implements ListSelectionListener {boolean isFixedColumnTable = true; // 默认由选中固定列表格中的行触发public MListSelectionListener(boolean isFixedColumnTable) {this.isFixedColumnTable = isFixedColumnTable;}public void valueChanged(ListSelectionEvent e) {if (isFixedColumnTable) { // 由选中固定列表格中的行触发int row = fixedColumnTable.getSelectedRow(); // 获得固定列表格中的选中行floatingColumnTable.setRowSelectionInterval(row, row); // 同时选中右侧可移动列表格中的相应行} else { // 由选中可移动列表格中的行触发int row = floatingColumnTable.getSelectedRow(); // 获得可移动列表格中的选中行fixedColumnTable.setRowSelectionInterval(row, row); // 同时选中左侧固定列表格中的相应行}}}}