JTable 动态地在任意位置增删表格的列操作

增删一列首先需要在原来的表格中得到选中的一列,这里需要添加JTable的鼠标单击事件,得到选中的列的索引,程序如下:

 

m_popupMenu = new JPopupMenu(); //创建JPopupMenu对象

 

table.addMouseListener(new MouseAdapter(){   //表格鼠标事件

public void mouseClicked(MouseEvente)

{

Point p = e.getPoint();                //获得鼠标在表格中选中点的坐标

rowInd = table.rowAtPoint(p);          //得到选中表格的行索引

columnInd = table.columnAtPoint(p);   //得到选中表格的列索引

if (rowInd == -1) {               //若没有选中行则跳出

return;

}

if (columnInd == -1) {              //若没有选中的列则跳出

return;

}

if(e.getButton() == MouseEvent.BUTTON3)    //在选中单元格右击鼠标弹出JPopupMenu弹出框

{

m_popupMenu.show(table, e.getX(), e.getY());   //m_popupMenu弹出的位置

}

}

});

 

得到选中列的索引后,进行表格新增列操作,由于只能在表格的最后一列新增列,若想在选中列索引位置新增列,需要两步操作,第一步将所有新增列后表格的列名全部存入addlist集合,(由于新增列的列名在表格的最后一列,将其删除)故而将addlist集合的最后一个元素删除,将新增的列名按选中的索引位置插入addlist集合,此时laddlistist中的元素位置就是在任意位置插入列后的新表格的列名。第二步将原表格的单元格值和新增列值,以在选中索引位置新增列的顺序存入二维数组。到这步就是将新表格的列名存入addlist集合,新表格的单元格值存入二维数组。

最后一步就是将二维数组和addlist集合全部以序放入新表中,就完成了新增列的操作,新增列的程序如下:

 

JMenuItem addCountItem= new JMenuItem();

addCountItem.setText(" 添加一列");

addCountItem.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvente)

{

String str=JOptionPane.showInputDialog(null,"请输入列名");  //使用输入提示框得到列名

((DefaultTableModel) table.getModel()).addColumn(str);  //表格添加输入列名的列

 

List<String> addlist= new ArrayList<String>();        //创建List集合用于存放表格列名

for(int i=0;i<table.getColumnCount();i++){

addlist.add(table.getColumnName(i));             //将表格列名放入list集合

}

addlist.remove(addlist.size()-1);   //由于表格添加列是在表格最后一列添加的,故而去除表格最后一列的列名

addlist.add(columnInd, str);   //在选中的表格索引处,将新增的表格列名存入addlist集合

String[][] Row=new String[table.getRowCount()][table.getColumnCount()];//创建二维字符串数组用于存放新表格的所有单元格值

for(int i=0;i<table.getRowCount();i++){

for(int j=0;j<table.getColumnCount();j++){

if(j<columnInd){

Row[i][j]=table.getValueAt(i, j)+"";       //小于选中的列的表格值直接存入数组

}else if(j==columnInd){

Row[i][j]="";           //等于选中的列索引(此处的选中列索引以为新增的列)的表格值直接清空存入数组

}else if(j>columnInd){

Row[i][j]=table.getValueAt(i, j-1)+"";  //大于选中列索引的表格值,需要将表格的列索引减1存入数组(此处不懂的动笔练习下)

}

}

}

//此时新增列后得到的新表的列名和表格的内容分别存入的addlist集合和Row二维数组,只要分别存入新表即可

DefaultTableModel myModel = new DefaultTableModel(table.getRowCount(),table.getColumnCount()){

public String getColumnName(intcolumnIndex){           //重写返回列名方法将addlist集合中的元素依序写入新表格列名

return addlist.get(columnIndex);

}

};

table.setModel(myModel);               //将模型插入表格

for(int i=0;i<Row.length;i++){

for(int j=0;j<Row[0].length;j++){

table.setValueAt(Row[i][j], i, j);                  //将二维数组Row中的值依序写入新表格的单元格中

}

}

addlist.add("");     //此语句一定要有否则重写列名的程序段会报数组越界错误,具体作用大家可去除一下看看现象

table.revalidate();

}

});

m_popupMenu.add(addCountItem);

 

在程序中有句addlist.add("");此句主要是由于重写了返回列名的方法,故而在没有此句时,第二次添加列使用模型会报集合越界错误。现象如下:

 

删除列时应先记录列名和表格数据,在进行删除。程序如下:

JMenuItem delCountItem = new JMenuItem();

delCountItem.setText(" 删除一列  ");

delCountItem.addActionListener(new ActionListener(){

public void actionPerformed(ActionEventevt) {

List<String> removelist = new ArrayList<String>();         //创建集合保存列名

for(int i=0;i<table.getColumnCount();i++){

removelist.add(table.getColumnName(i));

}

removelist.remove(columnInd);                                //删除选中列的列名

String[][] Row=new String[table.getRowCount()][table.getColumnCount()-1];  //创建二维数组保存表格内容

for(int i=0;i<table.getRowCount();i++){

for(int j=0;j<table.getColumnCount()-1;j++){

if(j<columnInd){

Row[i][j]=table.getValueAt(i, j)+"";

}else if(j>=columnInd){

Row[i][j]=table.getValueAt(i, j+1)+"";                //取消保存选中列的内容

}

}

}

DefaultTableModel  defaultModel    =   (DefaultTableModel) table.getModel();  //以下几句程序为删除表格最后一列

int   columncount   =  defaultModel.getColumnCount()-1;

TableColumnModel  columnModel   =   table.getColumnModel();

TableColumn  tableColumn   =   columnModel.getColumn(columncount);

columnModel.removeColumn(tableColumn);

defaultModel.setColumnCount(columncount);

DefaultTableModel myModel = new DefaultTableModel(table.getRowCount(),table.getColumnCount()){

public String getColumnName(intcolumnIndex){

return removelist.get(columnIndex);             //重写返回表格列名方法

}

};

table.setModel(myModel);

for(int i=0;i<Row.length;i++){

for(int j=0;j<Row[0].length;j++){

table.setValueAt(Row[i][j], i, j);   //将存入二维数组的值放入删除后的新表格中

}

}

removelist.add("");                       //此句作用与addlist.add("")相同功能

}

});

m_popupMenu.add(delCountItem);

 

现象如下:

 

总结:

虽然看上去是选中的任意位置进行的添加删除列操作,其系统依然是删除的表格的最后一列,只不过在操作完表格的新增(删除)列后,将表格的列名和表格的单元格值进行了重新分配,所有此时看上去就变成了在表格的任意位置添加删除列。在新分配后,表格的索引值和看到的表格新增删除是一样的,故而对表格的操作是没有影响的,可以很好的将表格的值和表格列名保存保存到数据库。

到此便完成了表格动态地任意位置增删列能,若大家调试遇到新问题,欢迎再下面补充并提出,大家一起进步,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值