[Java] Header checkBox in Jtable
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的更多相关文章
- java图像开发学习——JTable之导入数据库
package demo; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.MouseAd ...
- 编写Java程序,使用JTable表格组件展现人员信息列表
返回本章节 返回作业目录 需求说明: 使用JTable组件显现人员信息列表 实现思路: 创建一个JTable对象. 创建一个JScrollPane对象(显示横向和纵向滚动条). 将表格添加到滚动面板. ...
- unresolved inclusion in the java header in JNI
eclipse的ndk开发环境建差不多后打开jni的samples里的hello-jni项目.添加native和运行都没有问题,但是打开hello-jni.c看到一片红: 光这一个文件牵涉的问题有下面 ...
- JTable用法-实例
前几篇文章介绍了JTable的基本用法,本文实现一个简单的JTable,算是前文的一个总结,并造福供拷贝党们. Swing-JTable用法-入门 Swing-JTable的渲染器与编辑器使用demo ...
- 基于Java swing+mysql+eclipse的【水电费管理系统】
本项目为前几天收费帮学妹做的一个项目,Java swing项目,在工作环境中基本使用不到,但是很多学校把这个当做编程入门的项目来做,故分享出本项目供初学者参考. CSDN9.9赞助下载: https: ...
- 《java小应用程序(Applet)和java应用程序(Application)分别编写的简单计算器》
Application和Java Applet的区别.Java语言是一种半编译半解释的语言.Java的用户程序分为两类:Java Application和Java Applet.这两类程序在组成结构和 ...
- [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 ...
- android CheckBox的运用
CheckBox定义一个同意协议的按钮,只要同意button才可以点击 XML代码 <CheckBox android:id="@+id/checkbox1" android ...
- Spring MVC Checkbox And Checkboxes Example
In Spring MVC, <form:checkbox /> is used to render a HTML checkbox field, the checkbox values ...
随机推荐
- 网络通信协议三之TCP/IP模型详解
TCP/IP模型 注:PDU:Protocol Date Unit:表示对等层之间传递的数据单位 TCP:Transmission Control Protocol:传输控制协议 UDP:User D ...
- Hyper-V 与 VMware 和 vbox 的不兼容
新装的win10 开始先装到docker 装之前必须要装Hyper-V 后来装vbox 并且安装了Centos7系统也用得起,后来不知道怎么win10好像升级了.再启动vbox 开启centos7就报 ...
- 证书文件(pfx)读取时报 “指定的网络密码不正确”
实际情况: 1.本地测试正确,发布到windows server 2003 iis6 可以正常运行 发布到 windows server 2008 上 II7就报 “指定的网络密码不正确” 日志报错为 ...
- 启动weblogic报错:string value '2.4' is not a valid enumeration value for web-app-versionType in namespace http://java.sun.com/xml/ns/javaee
启动报错: 原因:有人改动了web.xml的头 解决方法: 在web.xml中修改抬头为: <?xml version="1.0" encoding="UTF-8& ...
- Steeltoe之Config客户端篇
Steeltoe是一款开源项目,其目标是选取源自Netflix及其它公司的工具,使它们能够运用于.NET社区.它不仅可以在.NET Core上,也可以在.NET Framework 4.X以上使用.此 ...
- MySQL的sql语言分类DML、DQL、DDL、DCL、
MySQL的sql语言分类DML.DQL.DDL.DCL. SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 1.数据定义语言DDL(Data ...
- CH 0101 - a^b / CH 0102 - 64位整数乘法 - [快速幂和快速乘]
0101 a^b 题目链接:传送门 描述 求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤10^9 输入格式 三个用空格隔开的整数 a,b 和 p. 输出格式 一个整数,表示 a^b mo ...
- MySQL获取分组后的TOP 1和TOP N记录-转
有时会碰到一些需求,查询分组后的最大值,最小值所在的整行记录或者分组后的top n行的记录,在一些别的数据库可能有窗口函数可以方面的查出来,但是MySQL没有这些函数,没有直接的方法可以查出来,可通过 ...
- Eclipse各个版本区别
1.eclipse下载地址: 最新版:http://www.eclipse.org/downloads/ 历史版:http://archive.eclipse.org/eclipse/download ...
- day14: 生成器进阶
1,复习,迭代器:双下方法很少直接调用,一般都是通过其他语法触发的:迭代器一定可迭代,可迭代的通过调用iter()方法皆可以得到一个迭代器. 迭代器很方便使用,所有的数据只可以取一次,节省内存空间.生 ...