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;
}
}
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;
}
}
确定几次,最后按复选框就响应多少次我试了,响应应该是上次没有移除监听如何移除监听啊,我都写了table.repaint();
接着table重新加栽几次,选择复选框就响应几次应该是上次加载的监听没有移除我已经写了table.repaint();
如何解决这个问题,谢谢大家
if (header != null) {
this.setForeground(header.getForeground());
this.setFont(header.getFont());
header.addMouseListener(this);//
}
你不信你可以试试把你的程序最小化,然后再还原,又会被加一次事件.
你要么在构造函数里加上listener,一定要在getTableCellRendererComponent里面加的话.
先removeMouseListener(this);然后再add.
或者用个循环getMouseListeners()返回一个listener数组,然后全部removeMouseListener掉.
移除,一直没找到又能实现效果又能移除的方法,
swing不熟,希望指教
doClick();
this.addItemListener(itemListener);
}重写构造方法
不加栽监听