本人在做一个在JTable上点击右键弹出菜单的程序时,遇到了这样的问题--菜单首项需要根据点击的表格行的"表名列"改变,这需要我们做一点小小的工作,其实就是
根据点击的位置推算所在行,好了,废话少说,看代码吧.
1.表格的建立过程
String[] headers = { "No", "Table Name" };
Object[][] cellData = null;
DefaultTableModel model = new DefaultTableModel(cellData, headers) {
public boolean isCellEditable(int row, int column) {
// 第N列可以编辑
/*
* if (column == N) { return false; }
*/
// 整个表都不能编辑
return false;
}
};
table = new JTable(model);
2.菜单的建立
popupMenu=new JPopupMenu();
tableNameItem=new JMenuItem("");
selectItem=new JMenuItem("Select SQL");
insertItem=new JMenuItem("Insert SQL");
deleteItem=new JMenuItem("Delete SQL");
updateItem=new JMenuItem("Update SQL");
hbmItem=new JMenuItem("hbm xml");
hbmPojoItem=new JMenuItem("Pojo Class");
popupMenu.add(tableNameItem);
popupMenu.addSeparator();
popupMenu.add(selectItem);
popupMenu.add(insertItem);
popupMenu.add(deleteItem);
popupMenu.add(updateItem);
popupMenu.addSeparator();
popupMenu.add(hbmItem);
popupMenu.add(hbmPojoItem);
3.菜单的弹出处理
table.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
if (evt.isPopupTrigger()) {
// 取得右键点击所在行
int row=evt.getY()/table.getRowHeight();
/**
* 取得是表名的那一列
*/
int tableNameColumn=-1;
for(int i=0;i<table.getColumnModel().getColumnCount();i++){
TableColumn selColumn = table.getColumnModel().getColumn(i);
String columnHeader=(String)selColumn.getHeaderValue();
if(columnHeader.equals("Table Name")){
tableNameColumn=i;
break;
}
}
/**
* 取得表名并弹出菜单
*/
if(tableNameColumn!=-1){
/**
* 修改菜单首条的名称
*/
String tableName=(String)table.getValueAt(row,tableNameColumn);
tableNameItem.setText(tableName);
// 弹出菜单
popupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
}
}
4.实现的效果如下: