The reference is from here.

在Jtable里面我们可能会有checkbox, 而有时候我们有很多checkbox需要同时check或者同时uncheck的时候, 如果有一个总的checkbox能够同时check所以该列的所有checkbox或者同时uncheck, 就会很有用. 所以这里我用一个checkBoxHeader 的class, 去将第一栏的header变为checkbox, 并且能够完成上述功能.

加checkBoxHeader之前:

加checkBoxHeader之后:

主要加的class为checkBoxHeader

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel; /**
* Used to create checkBox into the jTable header column
*
* @author Johnson
*/
public class CheckBoxHeader extends JCheckBox
implements TableCellRenderer, MouseListener
{
protected CheckBoxHeader rendererComponent;
protected int column;
protected boolean mousePressed = false; public CheckBoxHeader(ItemListener itemListener)
{
rendererComponent = this;
rendererComponent.addItemListener(itemListener);
} /**
*
* @param table
* @param value
* @param isSelected
* @param hasFocus
* @param row
* @param column
* @return
*/
@Override
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)
{ final Color bg = isSelected ? table.getSelectionBackground() : table.getBackground();
rendererComponent.setForeground(table.getForeground());
rendererComponent.setBackground(bg);
rendererComponent.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
rendererComponent.setHorizontalAlignment(SwingConstants.CENTER);
header.addMouseListener(rendererComponent);
}
}
setColumn(column);
return rendererComponent;
} protected void setColumn(int column)
{
this.column = column;
} public int getColumn()
{
return column;
} protected 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 checkBoxColumn = tableView.convertColumnIndexToModel(viewColumn); if (viewColumn == this.column && e.getClickCount() == 1 && checkBoxColumn != -1)
{
doClick();
}
}
} @Override
public void mouseClicked(MouseEvent e)
{
handleClickEvent(e);
((JTableHeader)e.getSource()).repaint();
} @Override
public void mousePressed(MouseEvent e)
{
mousePressed = true;
} @Override
public void mouseReleased(MouseEvent e)
{
// Do nothing here.
} @Override
public void mouseEntered(MouseEvent e)
{
// Do nothing here.
} @Override
public void mouseExited(MouseEvent e)
{
// Do nothing here.
}
}

这样, 我们已经建立了一个checkBoxHeader的class, 这样建一个object就可以去将Jtable的某一列的header变为checkbox了, 但是我们还需要给参数告诉它是在哪一列, 并且写logic, 去改变该列所有的其他的checkBox. 另外我们实际上是override之前有可能设置的header的类型及value, 比如上图中的header为string, value为" ".

加进去的话就是我们加入这几行在jtable的initialization的后面.

      TableColumn tc = jTable.getColumnModel().getColumn(0); // 这里看是第几列, 最好用enum去代替实际的列数
tc.setCellEditor(jTable.getDefaultEditor(Boolean.class)); // 这一列好像可以不要? 记住千万不要加入 tc.etCellRenderer(cellRenderer), 否者会override你设置的其他checkBox的设置.
tc.setHeaderRenderer(new CheckBoxHeader(new MyItemListener())); // 这里就是override之前的header的类型以及value

然后我们再实现MyItemListener这个函数, 在里面加入checkBoxHeader的logic, 也就是同时check或者uncheck所有的checkBox即可.

 /**
* Listener for check the headerCheckBox
*/
class MyItemListener implements ItemListener
{
/**
*
* @param e
*/
public void itemStateChanged(ItemEvent e)
{
Object source = e.getSource();
if (source instanceof AbstractButton == false) // 这个if好像可以不要?
{
return;
}
boolean checked = e.getStateChange() == ItemEvent.SELECTED;
for (PathEntry eachRow : _pathTableModel.rowData) // 这个for loop可以根据具体情况去改loop每一行或者可以有一个list去for每个元素好像更好, 最好不要用数字去代替每一行, 因为好像很不reusable.
{
if (eachRow.enabled)
{
eachRow.checked = checked;
}
}
jTable.getRowSorter().modelStructureChanged();
}
}

[Java] Header checkBox in Jtable的更多相关文章

  1. java图像开发学习——JTable之导入数据库

    package demo; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.MouseAd ...

  2. 编写Java程序,使用JTable表格组件展现人员信息列表

    返回本章节 返回作业目录 需求说明: 使用JTable组件显现人员信息列表 实现思路: 创建一个JTable对象. 创建一个JScrollPane对象(显示横向和纵向滚动条). 将表格添加到滚动面板. ...

  3. unresolved inclusion in the java header in JNI

    eclipse的ndk开发环境建差不多后打开jni的samples里的hello-jni项目.添加native和运行都没有问题,但是打开hello-jni.c看到一片红: 光这一个文件牵涉的问题有下面 ...

  4. JTable用法-实例

    前几篇文章介绍了JTable的基本用法,本文实现一个简单的JTable,算是前文的一个总结,并造福供拷贝党们. Swing-JTable用法-入门 Swing-JTable的渲染器与编辑器使用demo ...

  5. 基于Java swing+mysql+eclipse的【水电费管理系统】

    本项目为前几天收费帮学妹做的一个项目,Java swing项目,在工作环境中基本使用不到,但是很多学校把这个当做编程入门的项目来做,故分享出本项目供初学者参考. CSDN9.9赞助下载: https: ...

  6. 《java小应用程序(Applet)和java应用程序(Application)分别编写的简单计算器》

    Application和Java Applet的区别.Java语言是一种半编译半解释的语言.Java的用户程序分为两类:Java Application和Java Applet.这两类程序在组成结构和 ...

  7. [webgrid] – header - (How to Add custom html to Header in WebGrid)

    How to Add custom html to Header in WebGrid MyEvernote Link Posted on March 30, 2013by mtryambake Ho ...

  8. android CheckBox的运用

    CheckBox定义一个同意协议的按钮,只要同意button才可以点击 XML代码 <CheckBox android:id="@+id/checkbox1" android ...

  9. Spring MVC Checkbox And Checkboxes Example

    In Spring MVC, <form:checkbox /> is used to render a HTML checkbox field, the checkbox values ...

随机推荐

  1. 学习markdown语法

    12.内部跳转 [这是一个按钮](#测试标题) - 1 - 1 - 1 # 测试标题 这是一个按钮 1 1 1 测试标题 注:使用-代替空格

  2. Jwt 中 token应该存储到哪里?

    关于 token 的存储问题 JWT: csrf 攻击无法获取第三方的 cookie,而是直接使用 cookie进行查询的时候会自动携带 cookie. xss攻击通过代码注入可以获取 cookie. ...

  3. NFS使用autofs自动挂载

    NFS自动挂载设置在/etc/fstab和/etc/rc.local可能挂载不成功,假如是服务端NFS宕机还可能导致客户端无法启动,可以使用autofs实现自动挂载 安装autofs yum -y i ...

  4. POJ-1143(状态压缩)

    Number Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3432 Accepted: 1399 Descripti ...

  5. .NET Core错误:The specified framework 'Microsoft.NETCore.App', version '1.0.0-rc2-3002702' was not found.

    本地Dos命令行中,cd到你的项目目录下,生成, dotnet {U_Project_Name}.dll 发布 dotnet publish ,然后将发布的文件夹中的文件全部拷贝到服务器中,至此,问题 ...

  6. stm32中断遵循原则

    故障案例: 定时器定时触发一个定时事件,在这个事件里面,会调用一个串口发送程序,发现串口发送数据不完整. 分析: 1.将发送函数剥离,放到独立的线程工作,运行稳定 2.使用单步调试,在定时中断事件中多 ...

  7. AVD启动报错:Running an x86 based Android Virtual Device (AVD) is 10x faster

    1.cmd窗口中输入emulator -avd test 启动AVD时报错: Running an x86 based Android Virtual Device (AVD) is 10x fast ...

  8. python摸爬滚打之day14----内置函数,递归函数

    1.匿名函数 用一句话实现的简单函数. ret = lambda x : x ** 2      即 函数名 = lambda 形参 : 返回值 print(ret(5))  ----> 25 ...

  9. MySQL InnoDB加锁超时回滚机制(转)

    add by zhj: 看来我对MySQL的理解还有待深入,水还是挺深的啊,MySQL给记录加锁时,可以通过innodb_lock_wait_timeout参数设置超时时间, 如果加锁等待超过这个时间 ...

  10. CSS 优先级&伪元素&伪类

    优先级 单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素 伪元素 属性 描述 CSS :first-letter 向文本的第一个字母添加特殊样式 1 :first-line 向文本的首行 ...