带有行标题栏的表格

来源:互联网 发布:易语言玫瑰花表白源码 编辑:程序博客网 时间:2024/05/21 18:33

所谓的带有“行标题栏”就是带有固定列的表格。这种表格在swing中是经常使用到的,理由是:可以很好地呈现数据!

package 行标题栏;import javax.swing.*;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;import javax.swing.table.AbstractTableModel;import java.awt.*;import java.util.Vector; public class Example extends JFrame {    public static void main(String[] args) {        // TODO 自动生成的方法存根        Vector<String> columnNameV=new Vector<>();        columnNameV.add("日期");        for(int i=1;i<21;i++)        {            columnNameV.add("商品"+i);        }        Vector<Vector<Object>> tablevalues=new Vector<>();        for(int row=1;row<31;row++)        {            Vector<Object> rowV=new Vector<>();            rowV.add(row);            for(int col=0;col<20;col++)            {                rowV.add((int)(Math.random()*1000));            }            tablevalues.add(rowV);        }        final MfixedColumnTable pane=new MfixedColumnTable(columnNameV, tablevalues,1);         Example frame=new Example();         frame.setVisible(true);         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.setBounds(300, 100,400,300);        frame.getContentPane().add(pane,BorderLayout.CENTER);    }}     /*这里封装了一个"带有固定表格栏"的个性化"表格",下面是设计的全部代码!*/  class MfixedColumnTable extends JPanel   {      /* 以下是7个属性*/      private Vector<String> tableColumnName=new  Vector<>();      private Vector<Vector<Object>> tableValueV=new Vector<>();      private int MfixedColumns=1;      private fixedColumnTableModel fixModel;      private JTable fixtable;      private floatingColumnTableModel floatModel;      private JTable floattable;       /*以下是二个自己的表格模型*/      private class fixedColumnTableModel extends AbstractTableModel      {        @Override        public int getRowCount() {            // TODO 自动生成的方法存根            return  tableValueV.size();        }        @Override        public int getColumnCount() {            // TODO 自动生成的方法存根            return  MfixedColumns;        }        @Override        public Object getValueAt(int rowIndex, int columnIndex) {            // TODO 自动生成的方法存根            return  tableValueV.get(rowIndex).get(columnIndex);        }         public String getColumnName(int column)        {            return tableColumnName.get(column);        }      }      private class  floatingColumnTableModel extends AbstractTableModel      {        @Override        public int getRowCount() {            // TODO 自动生成的方法存根            return  tableValueV.size(); //返回总行数.        }        @Override        public int getColumnCount() {            // TODO 自动生成的方法存根            return (tableColumnName.size()-MfixedColumns); //总行数减去固定列数就是可移动的列数.        }        @Override        public Object getValueAt(int rowIndex, int columnIndex) {            // TODO 自动生成的方法存根            return  tableValueV.get(rowIndex).get(columnIndex+MfixedColumns);        }         public String getColumnName(int columnIndex)        {            return tableColumnName.get(columnIndex+MfixedColumns);        }      }      /*一下是一个ListselectionListener*/      class MlistsectionListener implements ListSelectionListener      {        private boolean isFixedSelection=true;        public MlistsectionListener(boolean isFixedSelection) {            // TODO 自动生成的构造函数存根            this.isFixedSelection=isFixedSelection;        }          @Override        public void valueChanged(ListSelectionEvent e) {            // TODO 自动生成的方法存根              if(isFixedSelection)              {                 int row=fixtable.getSelectedRow();                 floattable.setRowSelectionInterval(row, row);              }              else              {                  int row=floattable.getSelectedRow();                  fixtable.setRowSelectionInterval(row, row);              }        }      }      /*一下是类的构造方法,这个方法在这里是很重要!*/    public MfixedColumnTable(Vector<String>tableColumnName,Vector<Vector<Object>> tableValues,int fixCount) {        // TODO 自动生成的构造函数存根        this.setLayout(new BorderLayout());        /*赋值*/          this.tableColumnName=tableColumnName;          this.tableValueV=tableValues;          MfixedColumns=fixCount;            /* 固定表格的设计*/            fixModel=new fixedColumnTableModel();            fixtable=new JTable(fixModel);            ListSelectionModel selectionModel=fixtable.getSelectionModel();            selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);            selectionModel.addListSelectionListener(new MlistsectionListener(true));            /* 移动表格的设计*/            floatModel=new floatingColumnTableModel();            floattable=new JTable(floatModel);            ListSelectionModel selectionModel1=floattable.getSelectionModel();            selectionModel1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);            MlistsectionListener listener=new MlistsectionListener(false);            selectionModel1.addListSelectionListener(listener);             /*这部是很重要的,"关闭自动调整模式,是使用水平滚动条的必要设置."*/            floattable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);            /*建立视图*/            JScrollPane pane=new JScrollPane();            //将固定表格头放到窗体的左上角.            pane.setCorner(JScrollPane.UPPER_LEFT_CORNER,fixtable.getTableHeader());            //建立视图.            JViewport view=new JViewport();            //将固定表格添加到视图中.            view.setView(fixtable);            //设置视图和固定表格大小相同.             view.setPreferredSize(fixtable.getPreferredSize());            //将视图添加到panel的"标题栏视图"中,这个是很重要很重要的.直接决定最终的界面效果.             pane.setRowHeader(view);             //将移动表格添加到"默认视图"中.作用和上面是差不多的.在这里是一定要有的.             pane.setViewportView(floattable);             this.add(pane,BorderLayout.CENTER);             this.validate();        }   }  /*制作"带有固定列"的表格的设计   * 看了书之后可以做,但是我不明白原理!应该查一些资料.    */     

运行效果:

0 0