您的位置:首页 > 编程语言 > Java开发

[Java] JTable 表头加checkbox全选

2016-12-22 17:41 1046 查看
效果图:



class TableModelProxy extends AbstractTableModel

import javax.swing.table.AbstractTableModel;

public class TableModelProxy extends AbstractTableModel {

/**
*
*/
private static final long serialVersionUID = -3295581072864170310L;
private String[] columnNames;

public void setColumnNames(String[] columnNames) {
this.columnNames = columnNames;
}

public void setData(Object[][] data) {
this.data = data;
}

private Object[][] data;

public TableModelProxy(String[] columnNames, Object[][] data) {
// TODO Auto-generated constructor stub
this.columnNames = columnNames;
this.data = data;
}

@Override
public String getColumnName(int column) {
// TODO Auto-generated method stub
return columnNames[column];
}

@Override
public Class<?> getColumnClass(int columnIndex) {
// TODO Auto-generated method stub
return getValueAt(0, columnIndex).getClass();
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
// Only the last column can be edit.
if(rowIndex < columnNames.length - 1){
return false;
}else{
return true;
}
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
data[rowIndex][columnIndex] = aValue;
fireTableCellUpdated(rowIndex, columnIndex);
}

@Override
public int getRowCount() {
// TODO Auto-generated method stub
return data.length;
}

@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return columnNames.length;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return data[rowIndex][columnIndex];
}

public void selectAllOrNull(boolean value){
// Select All. The last column
for(int index = 0; index < getRowCount(); index ++){
this.setValueAt(value, index, getColumnCount() - 1);
}
}
}


class CheckHeaderCellRenderer implements TableCellRenderer

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;

public class CheckHeaderCellRenderer implements TableCellRenderer {
TableModelProxy tableModel;
JTableHeader tableHeader;
final JCheckBox selectBox;

public CheckHeaderCellRenderer(final JTable table) {
this.tableModel = (TableModelProxy) table.getModel();
this.tableHeader = table.getTableHeader();
selectBox = new JCheckBox(tableModel.getColumnName(table.getColumnCount() - 1));
selectBox.setSelected(false);
tableHeader.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() > 0) {
// 获得选中列
int selectColumn = tableHeader.columnAtPoint(e.getPoint());
if (selectColumn == table.getColumnCount() - 1) {
boolean value = !selectBox.isSelected();
selectBox.setSelected(value);
tableModel.selectAllOrNull(value);
tableHeader.repaint();
}
}
}
});
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
// TODO Auto-generated method stub
String valueStr = (String) value;
JLabel label = new JLabel(valueStr);
label.setHorizontalAlignment(SwingConstants.CENTER); // 表头标签剧中
selectBox.setHorizontalAlignment(SwingConstants.CENTER);// 表头标签剧中
selectBox.setBorderPainted(true);
JComponent component = (column == table.getColumnCount() - 1) ? selectBox : label;

component.setForeground(tableHeader.getForeground());
component.setBackground(tableHeader.getBackground());
component.setFont(tableHeader.getFont());
component.setBorder(UIManager.getBorder("TableHeader.cellBorder"));

return component;
}

}


Test Code: TestFrame.java

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;

public class TestFrame extends JFrame {

private JPanel contentPane;
private JTable table;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestFrame frame = new TestFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public TestFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("CheckBox Table");
this.setPreferredSize(new Dimension(400, 300));
// setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
table = new JTable();
JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
contentPane.add(scrollPane, BorderLayout.CENTER);
initTable();
pack();
}

private void initTable() {
String[] columnNames = {"name","age", "choose"};
Object[][] data = this.getData();
TableModelProxy tableModel = new TableModelProxy(columnNames, data);
table.setModel(tableModel);
table.getTableHeader().setDefaultRenderer(new CheckHeaderCellRenderer(table));
}

/**
* 获得数据
*
* @return
*/
private Object[][] getData() {
Object[][] data = {
{ "Kathy", 5, new Boolean(false) },
{ "John", 15, new Boolean(true) },
{ "Sue", 16, new Boolean(false) },
{ "Jane",17, new Boolean(true) },
{ "Joe", 18, new Boolean(false) } };
return data;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java checkbox