增删一列首先需要在原來的表格中得到選中的一列,這裡需要添加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);
現象如下:
總結:
雖然看上去是選中的任意位置進行的添加删除列操作,其系統依然是删除的表格的最後一列,隻不過在操作完表格的新增(删除)列後,将表格的列名和表格的單元格值進行了重新配置設定,所有此時看上去就變成了在表格的任意位置添加删除列。在新配置設定後,表格的索引值和看到的表格新增删除是一樣的,故而對表格的操作是沒有影響的,可以很好的将表格的值和表格列名儲存儲存到資料庫。
到此便完成了表格動态地任意位置增删列能,若大家調試遇到新問題,歡迎再下面補充并提出,大家一起進步,謝謝!