所谓的带有“行标题栏”就是带有固定列的表格。这种表格在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();
}
}
/*制作"带有固定列"的表格的设计
* 看了书之后可以做,但是我不明白原理!应该查一些资料.
*/
运行效果: