import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.MenuElement;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
/*
*JTable表格头右键菜单实现列标题隐藏显示功能
*/
@SuppressWarnings("serial")
public class JTableEx extends JTable {
private Map<String,TableColumn> hiddenColumnMap=new HashMap<String,TableColumn>();
private Map<TableColumn,Boolean> enableColumnMap=new HashMap<TableColumn,Boolean>();
private List<TableColumn> removeList=new ArrayList<TableColumn>();
private JPopupMenu popupMenu=new JPopupMenu();
public JTableEx() {
super();
}
public JTableEx(DefaultTableModel dtm) {
super(dtm);
}
@Override
public void removeColumn(TableColumn arg0) {
super.removeColumn(arg0);
if(!removeList.contains(arg0)){
removeList.add(arg0);
}
}
public void addTableHeaderPopupMenu(){
setTableHeaderPopumMenu();
getTableHeader().addMouseListener(new MouseAdapter(){
@Override
public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger()){
popupMenu.show(JTableEx.this, e.getX(), e.getY()-25);
}
}
});
}
public void setTableHeaderEnable(TableColumn tc,boolean enable){
if(tc==null){
return;
}
MenuElement[] menus=popupMenu.getSubElements();
enableColumnMap.put(tc, enable);
for(int i=0;i<menus.length;i++){
Component c=menus[i].getComponent();
if(c instanceof JCheckBoxMenuItem){
JCheckBoxMenuItem menu=(JCheckBoxMenuItem) c;
if(menu.getText().equals(tc.getHeaderValue())){
menu.setSelected(enable);
menu.setEnabled(enable);
}
}
}
}
private void setTableHeaderPopumMenu(){
int columns=getModel().getColumnCount();
TableColumn tc=null;
for(int i=0;i<columns;i++){
String columnName=getModel().getColumnName(i);
if(removeList.contains(columnName)){
continue;
}
tc=this.getColumn(columnName);
if(tc==null){
continue;
}
final JCheckBoxMenuItem menu=new JCheckBoxMenuItem(columnName);
popupMenu.add(menu);
Boolean enable=enableColumnMap.get(tc);
menu.setSelected(enable==null?true:enable);
menu.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
setColumnMenuShow(menu.getText(),menu.isSelected());
}
});
}
}
private void setColumnMenuShow(String columnName,boolean enable){
TableColumn tc=null;
if(!enable){
tc=getColumn(columnName);
if(tc!=null){
hiddenColumnMap.put(columnName, tc);
removeColumn(tc);
}
}else{
tc=hiddenColumnMap.get(columnName);
if(tc!=null){
addColumn(tc);
moveColumn(tc);
}
}
}
private void moveColumn(TableColumn tc){
int columns=getModel().getColumnCount();
boolean isExist=false;
int curColumnIndex=0;
for(int i=0;i<columns;i++){
String columnName=getModel().getColumnName(i);
if(tc.getHeaderValue().equals(columnName)){
isExist=true;
curColumnIndex=i;
break;
}
}
if(isExist){
for(int j=0;j<getColumnCount();j++){
int modelColumn=convertColumnIndexToModel(j);
if(modelColumn>curColumnIndex){
moveColumn(getColumnCount()-1, j);
break;
}
}
}
}
}
public class Test {
public static void main(String[] args) {
new Test().init();
}
private void init(){
DefaultTableModel dtm=new DefaultTableModel(new Object[]{"id","name","remark"},0);
JTableEx table=new JTableEx(dtm);
table.addTableHeaderPopupMenu();
table.setTableHeaderEnable(table.getColumn("id"),false);
JFrame f=new JFrame("Demo Table");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(table));
f.setSize(400, 300);
f.setLocation(300, 200);
f.setVisible(true);
}
}