天天看點

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);

現象如下:

總結:

雖然看上去是選中的任意位置進行的添加删除列操作,其系統依然是删除的表格的最後一列,隻不過在操作完表格的新增(删除)列後,将表格的列名和表格的單元格值進行了重新配置設定,所有此時看上去就變成了在表格的任意位置添加删除列。在新配置設定後,表格的索引值和看到的表格新增删除是一樣的,故而對表格的操作是沒有影響的,可以很好的将表格的值和表格列名儲存儲存到資料庫。

到此便完成了表格動态地任意位置增删列能,若大家調試遇到新問題,歡迎再下面補充并提出,大家一起進步,謝謝!