酒店管理系统之年结帐界面(swing)
上面代码得出如下图:
上面在100行:
getContentPane().add(new FixedColumnTablePanel(tableColumnV,tableValueV, 1), BorderLayout.CENTER);
中还用到下面代码:package com.mwq.mwing;import java.awt.BorderLayout;import java.awt.Color;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;import javax.swing.table.DefaultTableCellRenderer;import javax.swing.table.JTableHeader;import javax.swing.table.TableCellRenderer;public class FixedColumnTablePanel extends JPanel {private MTable fixedColumnTable;private FixedColumnTableModel fixedColumnTableModel;private MTable floatingColumnTable;private FloatingColumnTableModel floatingColumnTableModel;private Vector<String> tableColumnV;private Vector<Vector<Object>> tableValueV;private int fixedColumn = 2;public FixedColumnTablePanel(Vector<String> tableColumnV,Vector<Vector<Object>> tableValueV, int fixedColumn) {super();setLayout(new BorderLayout());this.tableColumnV = tableColumnV;this.tableValueV = tableValueV;this.fixedColumn = fixedColumn;fixedColumnTableModel = new FixedColumnTableModel();// 创建固定列表格模型对象fixedColumnTable = new MTable(fixedColumnTableModel);// 创建固定列表格对象ListSelectionModel fixed = fixedColumnTable.getSelectionModel();// 获得选择模型对象fixed.addListSelectionListener(new MListSelectionListener(true));// 添加行被选中的事件监听器floatingColumnTableModel = new FloatingColumnTableModel();// 创建可移动列表格模型对象floatingColumnTable = new MTable(floatingColumnTableModel);// 创建可移动列表格对象ListSelectionModel floating = floatingColumnTable.getSelectionModel();// 获得选择模型对象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);//}class MTable extends JTable {public MTable(AbstractTableModel tableModel) {super(tableModel);setAutoResizeMode(JTable.AUTO_RESIZE_OFF);}// 表格列名信息@Overridepublic JTableHeader getTableHeader() {// 获得表格头对象JTableHeader tableHeader = super.getTableHeader();tableHeader.setReorderingAllowed(false);// 设置表格列不可重排// 获得表格头的单元格对象DefaultTableCellRenderer defaultRenderer = (DefaultTableCellRenderer) tableHeader.getDefaultRenderer();// 设置单元格内容(即列名)居中显示defaultRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);return tableHeader;}// 表格列值居中显示@Overridepublic TableCellRenderer getDefaultRenderer(Class<?> columnClass) {DefaultTableCellRenderer defaultRenderer = (DefaultTableCellRenderer) super.getDefaultRenderer(columnClass);defaultRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);return defaultRenderer;}// 表格行只可单选@Overridepublic ListSelectionModel getSelectionModel() {ListSelectionModel selectionModel = super.getSelectionModel();selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);return selectionModel;}// 用来设置表格的选中行@Overridepublic void setRowSelectionInterval(int fromRow, int toRow) {// 重构父类的方法super.setRowSelectionInterval(fromRow, toRow);}// 用来设置表格的唯一选中行public void setRowSelectionInterval(int row) {// 通过重载实现自己的方法setRowSelectionInterval(row, row);}}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 tableColumnV.get(columnIndex);}}class FloatingColumnTableModel extends AbstractTableModel {public int getColumnCount() {// 返回可移动列的数量return tableColumnV.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 tableColumnV.get(columnIndex + fixedColumn);// 需要为列索引加上固定列的数量}}class MListSelectionListener implements ListSelectionListener {boolean isFixedColumnTable = true; // 默认由选中固定列表格中的行触发public MListSelectionListener(boolean isFixedColumnTable) {this.isFixedColumnTable = isFixedColumnTable;}public void valueChanged(ListSelectionEvent e) {if (isFixedColumnTable) { // 由选中固定列表格中的行触发int selectedRow = fixedColumnTable.getSelectedRow(); // 获得固定列表格中的选中行floatingColumnTable.setRowSelectionInterval(selectedRow); // 同时选中可移动列表格中的选中行} else { // 由选中可移动列表格中的行触发int selectedRow = floatingColumnTable.getSelectedRow(); // 获得可移动列表格中的选中行fixedColumnTable.setRowSelectionInterval(selectedRow); // 同时选中固定列表格中的选中行}}}}