带有行标题栏的表格

所谓的带有“行标题栏”就是带有固定列的表格。这种表格在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();




        }

   }
  /*制作"带有固定列"的表格的设计
   * 看了书之后可以做,但是我不明白原理!应该查一些资料.
    */     




运行效果:

猜你喜欢

转载自blog.csdn.net/huangchongwen/article/details/50792244