[Java] JTable 表头加checkbox全选
2016-12-22 17:41
1046 查看
效果图:
class TableModelProxy extends AbstractTableModel
class CheckHeaderCellRenderer implements TableCellRenderer
Test Code: TestFrame.java
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; } }
相关文章推荐
- JTable中 表头中添加 JCheckBox 全选 反向选择 功能 CheckHeaderCellRenderer类
- JTable中 表头中添加 JCheckBox 全选 反向选择 功能
- JTable中 表头中添加 JCheckBox 全选 反向选择 功能
- JTable中 表头中添加 JCheckBox 全选 功能
- Android(Java):Android ListView checkbox 全选效果
- 利用JavaScript实现GridView中表头CheckBox的全选功能
- [extjs]GridPanel中表头checkbox全选框的bug
- JAVA-SWT如何在Jtable单元格中加入复选框Jcheckbox,Jbutton,JcomboBox
- UltraWinGrid 表头加checkbox,加全选功能
- WPF DataGrid表头Checkbox 全选与全反选
- DataGrid 简单自定义表头插入CheckBox实现全选/全不选
- Java Swing 在 JTable 中给 JCheckbox 绑定事件的方法
- java基础---Jquery复选框checkbox全选反选及选中事件
- 给DataGrid加CheckBox列并在表头添加全选、全选按钮、置零按钮
- Java Swing JTable 表格【3:创建表格,表头存在的设置】
- Java Swing JTable 表格【13:为表格的表头指定文字说明】
- Showing JTable Header Without Using JScrollPane java中的JTable不显示表头的原因
- [JAVA] 设置图标,设置字体,设置界面风格,JTable显示表头且设置不可编辑
- 利用JavaScript实现GridView中表头CheckBox的全选功能
- java JTable设置表头多行