我想在表头中显示一个全选的按钮,点击后选择表中所有的行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;
}

}

解决方案 »

  1.   

    你的全选必须要放在表头么?放在表的外面不行么?比如在表的外面添加一个JCheckBox,然后通过这个JCheckBox的状态来达到全选或者全不选效果不行么?
      

  2.   

    要求就是放在表头显示
    我修改表头的TableColumnModel 
    会将行全部修改了 
      

  3.   

    学习,估计要继承Jtable的Header了。
      

  4.   

    晕。没看明白。你要的那个全选的按钮放在那一列?不需要设置ui吧。通常改变皮肤风格的时候才去动ui。
    我没用按钮,我在那里放了一个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();
    }
    }