package TestTable;import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;class CheckBoxHeaderTest extends JFrame {
Object colNames[] = { "Col1", "Col2", "Col3", "Col4" }; // Object[][] data = null;
DefaultTableModel dtm; JTable table = new JTable(); Vector vector = new Vector(); Vector vectorName = new Vector(); Vector data = new Vector(); ArrayList list = new ArrayList(); XJTableModal jmodel; public CheckBoxHeaderTest() {
setLocation(400, 100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
vectorName.addElement("Col1");
vectorName.addElement("Col2");
vectorName.addElement("Col3");
vectorName.addElement("Col4"); for (int i = 0; i < 5; i++) {
TestBean bean = new TestBean();
bean.setName1("col1");
bean.setName2("col2");
bean.setName3("col3");
bean.setName4("col4");
list.add(bean);
} for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
vector.add("col" + (j + 1));
}
data.add(vector);
}
jmodel = new XJTableModal(vectorName, data); JScrollPane sp = new JScrollPane();
JButton jbutton = new JButton("确定"); sp.setViewportView(table);
MyItemListener myItemListener = new MyItemListener(); table.setModel(jmodel); for (int i = 0; i < table.getColumnCount(); i++) {
table.getTableHeader().getColumnModel().getColumn(i)
.setHeaderRenderer(
new MyTableHeaderRenderer(myItemListener));
}
jbutton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub Vector data1 = new Vector(); for (int j = 0; j < list.size(); j++) {
TestBean bean = new TestBean();
bean = (TestBean) list.get(j);
Vector test = new Vector();
for (int i = 0; i < vectorName.size(); i++) {
String name = vectorName.get(i).toString().substring(3);
int id = Integer.parseInt(name);
if (id == 1) {
test.add(bean.getName1());
}
if (id == 2) {
test.add(bean.getName2());
}
if (id == 3) {
test.add(bean.getName3());
}
if (id == 4) {
test.add(bean.getName4());
}
}
data1.add(test);
}
jmodel = new XJTableModal(vectorName, data1);
table.setModel(jmodel);
MyItemListener myItemListener = new MyItemListener();
for (int i = 0; i < table.getColumnCount(); i++) {
table.getTableHeader().getColumnModel().getColumn(i)
.setHeaderRenderer(
new MyTableHeaderRenderer(myItemListener));
}
table.repaint();
} });
this.getContentPane().setLayout(new BorderLayout());
getContentPane().add(sp, BorderLayout.NORTH);
getContentPane().add(jbutton, BorderLayout.SOUTH);
pack();
} public static void main(String[] args) {
new CheckBoxHeaderTest().setVisible(true);
} class MyItemListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
String state = (e.getStateChange() == ItemEvent.SELECTED) ? "checked"
: "unchecked";
int column = ((MyTableHeaderRenderer) (e.getItem())).getColumn();
 System.out.println("column:"+column + state);
String columnName = ((MyTableHeaderRenderer) (e.getItem()))
.getColumnName();
if (state.equals("checked")) {
vectorName.add(((MyTableHeaderRenderer) (e.getItem()))
.getColumnName());
} else {
vectorName.remove(((MyTableHeaderRenderer) (e.getItem()))
.getColumnName());
}
System.out.println(vectorName);
}
} public class MyTableHeaderRenderer extends JCheckBox implements
TableCellRenderer, MouseListener { protected int column; protected String columnName; protected boolean mousePressed = false; public MyTableHeaderRenderer(ItemListener itemListener) {
doClick();
this.addItemListener(itemListener);
} public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (table != null) {
JTableHeader header = table.getTableHeader();
if (header != null) {
this.setForeground(header.getForeground());
this.setFont(header.getFont());
header.addMouseListener(this);
}
}
setColumn(column);
setColumnName(column, table);
this.setHorizontalAlignment(SwingConstants.CENTER);
this.setText((String) table.getTableHeader().getColumnModel()
.getColumn(column).getHeaderValue());
return this;
} protected void setColumn(int column) {
this.column = column;
} protected void setColumnName(int column, JTable table) {
this.columnName = table.getTableHeader().getColumnModel()
.getColumn(column).getHeaderValue().toString();
} public String getColumnName() {
return columnName;
} public int getColumn() {
return column;
} private void handleClickEvent(MouseEvent e) {
if (mousePressed) {
mousePressed = false; JTableHeader header = (JTableHeader) (e.getSource());
JTable tableView = header.getTable();
TableColumnModel columnModel = tableView.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = tableView.convertColumnIndexToModel(viewColumn); if (viewColumn == this.column && e.getClickCount() == 1
&& column != -1) {
doClick();
}
}
} public void mouseClicked(MouseEvent e) {
handleClickEvent(e);
((JTableHeader) e.getSource()).repaint();
} public void mousePressed(MouseEvent e) {
mousePressed = true;
} public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) {
} public void mouseExited(MouseEvent e) {
} }}class TestBean {
private String name1; private String name2; private String name3; private String name4; public String getName1() {
return name1;
} public void setName1(String name1) {
this.name1 = name1;
} public String getName2() {
return name2;
} public void setName2(String name2) {
this.name2 = name2;
} public String getName3() {
return name3;
} public void setName3(String name3) {
this.name3 = name3;
} public String getName4() {
return name4;
} public void setName4(String name4) {
this.name4 = name4;
}
}
package TestTable;import java.util.Vector;import javax.swing.table.AbstractTableModel;public class XJTableModal extends AbstractTableModel {
  private Vector data;
  private Vector column;
  public XJTableModal(Vector column,Vector data) {
    this.data=data;
    this.column=column;
  }
  public int getRowCount() {
    return data.size();
  }
  public int getColumnCount() {
    return column.size();
  }
  public Object getValueAt(int rowIndex, int columnIndex) {
    if (data.isEmpty())
      return null;
    else
      return ((Vector)data.elementAt(rowIndex)).elementAt(columnIndex);
  }
  public Class getColumnClass(int column){
      return getValueAt(0,column).getClass();
       }        public String getColumnName(int columnIndex){
         return column.elementAt(columnIndex).toString();
          }
  public Vector getData(){
    return this.data;
  }
}

解决方案 »

  1.   

    第一次运行的时候,点击上面的复选框的时候,只响应一次,当我按确定后,再点击复选框的时候,响应2次,
    确定几次,最后按复选框就响应多少次我试了,响应应该是上次没有移除监听如何移除监听啊,我都写了table.repaint();
      

  2.   

    第一次加栽的时候,选择复选框,只响应一次,当我按确定按纽的时候,再选择复选框加栽2次
    接着table重新加栽几次,选择复选框就响应几次应该是上次加载的监听没有移除我已经写了table.repaint();
    如何解决这个问题,谢谢大家
      

  3.   

    你在cellrenderer里添加mouse事件?没有remove过.只要状态一被改变就会add一次.
    if (header != null) {
         this.setForeground(header.getForeground());
         this.setFont(header.getFont());
         header.addMouseListener(this);//
    }
      

  4.   

    你不要在getTableCellRendererComponent这个方法里添加侦听器,因为只要被重画,这个方法就会被调到.
    你不信你可以试试把你的程序最小化,然后再还原,又会被加一次事件.
    你要么在构造函数里加上listener,一定要在getTableCellRendererComponent里面加的话.
    先removeMouseListener(this);然后再add.
    或者用个循环getMouseListeners()返回一个listener数组,然后全部removeMouseListener掉.
      

  5.   

    我前面构造的时候是为了监听一个table head,如果加在构造方法中,就没办法实现了对复选框 的判断
    移除,一直没找到又能实现效果又能移除的方法,
    swing不熟,希望指教
      

  6.   

    我要实现在一个table面版中添加数据,并且可以让用户选择他可以需要哪列,点提交后,会根据他选择的信息,重新加栽进TABLE,如果他没选择哪列,那列信息就会消失http://topic.csdn.net/u/20080423/10/1ba6f306-2175-4c00-b2c2-7581daf4b4f4.html
      

  7.   

            public MyTableHeaderRenderer(ItemListener itemListener) {
                doClick();
                this.addItemListener(itemListener);
            }重写构造方法
    不加栽监听