我想在表头中显示一个全选的按钮,点击后选择表中所有的行import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.plaf.TableHeaderUI;
import javax.swing.plaf.basic.BasicTableHeaderUI;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;public class TestTableModel extends JFrame {
//DefaultTableModel dtm = new DefaultTableModel();
JTable table;
private static final long serialVersionUID = 1L; TestTableModel() {
initTable();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
}
private void initTable () {
JScrollPane spnl = new JScrollPane();
table = new JTable();
DefaultTableModel dtm = new DefaultTableModel(
new Object [] {"全选","姓名", "年龄", "班级", "性别"},0);
dtm.addRow(new Object[] {new Boolean(false),"fox","12","050101","男"});
dtm.addRow(new Object[] {new Boolean(false),"fox1","121","0501011","男"});
table.setModel(dtm);
TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox()));
tcm.getColumn(0).setCellRenderer(new MyColumnRenderer("选择"));
tcm.getColumn(0).setPreferredWidth(60);
tcm.getColumn(0).setWidth(60);
tcm.getColumn(0).setMaxWidth(60);
JTableHeader th = table.getTableHeader();
th.setUI(new BasicTableHeaderUI(){
JCheckBox chk = new JCheckBox("全选");
@Override
public void paint(Graphics g, JComponent c) {
// 不知道怎么写了
super.paint(g, c);
g.setColor(Color.red);
g.draw3DRect(5, 5, 10, 10, false);
}
} );
spnl.setViewportView(table);
this.getContentPane().add(spnl,BorderLayout.CENTER);
}
public static void main(String[] args) {
new TestTableModel().setVisible(true); }}
class MyColumnRenderer extends JCheckBox implements TableCellRenderer { private static final long serialVersionUID = 1L;
String test;
MyColumnRenderer(String test) {
this.test = test;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// TODO Auto-generated method stub
this.setSelected((Boolean)value);
this.setText(test);
return this;
}
}
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.plaf.TableHeaderUI;
import javax.swing.plaf.basic.BasicTableHeaderUI;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;public class TestTableModel extends JFrame {
//DefaultTableModel dtm = new DefaultTableModel();
JTable table;
private static final long serialVersionUID = 1L; TestTableModel() {
initTable();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
}
private void initTable () {
JScrollPane spnl = new JScrollPane();
table = new JTable();
DefaultTableModel dtm = new DefaultTableModel(
new Object [] {"全选","姓名", "年龄", "班级", "性别"},0);
dtm.addRow(new Object[] {new Boolean(false),"fox","12","050101","男"});
dtm.addRow(new Object[] {new Boolean(false),"fox1","121","0501011","男"});
table.setModel(dtm);
TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox()));
tcm.getColumn(0).setCellRenderer(new MyColumnRenderer("选择"));
tcm.getColumn(0).setPreferredWidth(60);
tcm.getColumn(0).setWidth(60);
tcm.getColumn(0).setMaxWidth(60);
JTableHeader th = table.getTableHeader();
th.setUI(new BasicTableHeaderUI(){
JCheckBox chk = new JCheckBox("全选");
@Override
public void paint(Graphics g, JComponent c) {
// 不知道怎么写了
super.paint(g, c);
g.setColor(Color.red);
g.draw3DRect(5, 5, 10, 10, false);
}
} );
spnl.setViewportView(table);
this.getContentPane().add(spnl,BorderLayout.CENTER);
}
public static void main(String[] args) {
new TestTableModel().setVisible(true); }}
class MyColumnRenderer extends JCheckBox implements TableCellRenderer { private static final long serialVersionUID = 1L;
String test;
MyColumnRenderer(String test) {
this.test = test;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// TODO Auto-generated method stub
this.setSelected((Boolean)value);
this.setText(test);
return this;
}
}
我修改表头的TableColumnModel
会将行全部修改了
我没用按钮,我在那里放了一个JCheckBox,这个是我开始的时候看错了。懒得改了,差不了太多。代码在下面。共两个文件。你可以参考一下。
TableFrame.javaimport java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;public class TableFrame extends JFrame { private static final long serialVersionUID = 1L;
Vector<String> columnNames = new Vector<String>();
Vector<Vector<String>> data = new Vector<Vector<String>>(); private JTable table; public TableFrame() {
super();
initData();
Container c = getContentPane();
c.setLayout(new BorderLayout());
table = new JTable(new TModel());
table.setColumnSelectionAllowed(true);
final JTableHeader tableHeader = table.getTableHeader();
tableHeader.setReorderingAllowed(false);
tableHeader.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int col = table.columnAtPoint(e.getPoint());
TableCellRenderer headerRenderer = table.getColumnModel()
.getColumn(col).getHeaderRenderer();
if (headerRenderer instanceof CheckBoxHeader) {
CheckBoxHeader h = (CheckBoxHeader) headerRenderer;
h.processMouseEvent(e);
tableHeader.repaint();
if (h.getSelected()) {
table.selectAll();
} else {
table.clearSelection();
}
}
} }); table.getColumnModel().getColumn(0).setHeaderRenderer(
new CheckBoxHeader());
c.add(new JScrollPane(table)); setSize(800, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
} private void initData() {
for (int i = 0; i < 5; i++) {
columnNames.add("column " + i);
} for (int i = 0; i < 20; i++) {
Vector<String> v = new Vector<String>();
for (int j = 0; j < 5; j++) {
v.add(i + " " + j);
}
data.add(v);
}
} class TModel extends DefaultTableModel {
private static final long serialVersionUID = 1L; @Override
public int getRowCount() {
return data.size();
} @Override
public int getColumnCount() {
return columnNames.size();
} @Override
public Object getValueAt(int row, int column) {
return data.get(row).get(column);
} @Override
public String getColumnName(int column) {
return columnNames.get(column);
} @Override
public boolean isCellEditable(int row, int column) {
return false;
}
} public static void main(String[] args) {
new TableFrame();
}
}CheckBoxHeader.javaimport java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;import javax.swing.JCheckBox;
import javax.swing.SwingUtilities;import sun.swing.table.DefaultTableCellHeaderRenderer;public class CheckBoxHeader extends DefaultTableCellHeaderRenderer { private static final long serialVersionUID = 1L;
JCheckBox box; public CheckBoxHeader() {
super();
box = new JCheckBox();
box.setSelected(true);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
System.out.println("mouseClicked");
}
});
} @Override
public void paintComponent(Graphics g) {
Rectangle bounds = getBounds();
Insets insets = getInsets(); // bounds.x = insets.top;
bounds.y = insets.left;
bounds.height -= insets.top + insets.bottom;
bounds.width -= insets.left + insets.right; SwingUtilities.paintComponent(g, box, this, bounds);
super.paintComponent(g);
} @Override
public void processMouseEvent(MouseEvent e) {
super.processMouseEvent(e);
boolean selected = box.isSelected();
System.out.println(selected);
box.setSelected(!selected);
box.validate();
box.revalidate();
box.repaint();
} boolean getSelected() {
return box.isSelected();
}
}