[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 ...
随机推荐
- python 中 打印及格式化字符串的相关方法
原文 将值转换为字符串 Python 有多种方式将任何值转为字符串: 将它传给 repr() 或 str() 函数. repr() 和 str() 的区别,看几个例子: >>> pr ...
- ElasticSearch入门 第二篇:集群配置
这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- Sqlite数据库管理(SQLite Developer) v4.0.0.528 中文版+破解方法(申明:来源于网络)
Sqlite数据库管理(SQLite Developer) v4.0.0.528 中文破解版 SharpPlus Sqlite Developer 特性: -强大的SQL编辑器 *Sqlite Sql ...
- JQuery登录代码
$(function () { $("#login").submit(function(event) { event.preventDefault(); if ($("# ...
- TOP100summit2017:网易云通信与视频CTO赵加雨:外力推动下系统架构的4个变化趋势
壹佰案例:很荣幸邀请到您成为第六届壹佰案例峰会架构专场的联席主席,您曾深度参与Cisco Jabber,Webex Meeting, Cisco Spark等多项分布式实时通信类产品的架构与研发, ...
- 为何串口dma发送数据可能不完整
串口dma数据发送不完整, 1. 通过打印log说明数据合成,送给dma buff都是正常的. 2. 数据通过硬件串口直接配置,是正常的 3. 数据通过单片机dma转发后数据异常,通过检查发现 dma ...
- python中的风险
from math import e print(e) e = "中华人民共和国1" print(e) 输出: 2.718281828459045 中华人民共和国1 用from方式 ...
- [No0000134]C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- Hive之变量和属性
首先看一下hive cli工具对于变量的定义规定的几项功能: $ bin/hive -h usage: hive -d,--define <key=value> Vari ...
- VS在解决方案中添加一个别人给的项目,我自己的项目主窗体中不能调用
提示缺少Using引用,我在主窗体中已经写了Using XX,还是提示“未能找到类型或命名空间名“ XX”(是否缺少Using指令或程序集引用?)”,以前只要Using 一下就好了,后来想了一下,要在 ...