增删一列首先需要在原来的表格中得到选中的一列,这里需要添加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);
现象如下:
总结:
虽然看上去是选中的任意位置进行的添加删除列操作,其系统依然是删除的表格的最后一列,只不过在操作完表格的新增(删除)列后,将表格的列名和表格的单元格值进行了重新分配,所有此时看上去就变成了在表格的任意位置添加删除列。在新分配后,表格的索引值和看到的表格新增删除是一样的,故而对表格的操作是没有影响的,可以很好的将表格的值和表格列名保存保存到数据库。
到此便完成了表格动态地任意位置增删列能,若大家调试遇到新问题,欢迎再下面补充并提出,大家一起进步,谢谢!