<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 12">
<meta name="Originator" content="Microsoft Word 12">
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml">
<link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso">
<!--[if !mso]>
<style>
v":* {behavior:url(#default#VML);}
o":* {behavior:url(#default#VML);}
w":* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx">
<link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml">
<!--[if gte mso 9]><xml>
Normal
0
false
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:0 0 0 0 0 0 0 0 0 0;
mso-font-alt:"Times New Roman";}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style>
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","serif";}
</style>
<![endif]-->
前面讲了JTale表头的基本属性设置和表头放置组件之后,表头的显示效果操作也就这么多了,更复杂的显示则是表头的合并,单行行合并、多行多列合并等.再说那个之前先看其余的一种情况:说是对表头的修改吧,其实代码中对JTable的表头的代码很少只有几句,但是效果的确是体现在表头上的.
先看图,一个基本的JTable:
<!--[if gte vml 1]>
<![endif]-->
这是最简单的JTable生成的,但是很多时候我们觉得列太多了,不想看到这么多,需要隐藏一部分,当然通过在JTable的Header上的右键菜单弹出可以让我们选择那个显示那个隐藏,然后通过,设置JtableHeader的宽度来实现隐藏显示是可以的,但是可能有这个问题,万一使用的人不知道右键呢?万一觉得效果不好呢?所以这里实现另外一种方法,放置一个左右的按钮在JtableHeader上,单击可以增加减少列,比较直观,效果如图:
<!--[if gte vml 1]>
<![endif]-->
再减少几列:
<!--[if gte vml 1]>
<![endif]-->
这个实现比较简单,主要是Border问题和Layout的问题,技术问题很少:
工程目录如下:
<!--[if gte vml 1]>
<![endif]-->
看看最终的图,想到什么?JscrollPanel.下面是JscrollPanel的结构样式:
<!--[if gte vml 1]>
<![endif]-->
我们其实就是在corner位置放置我们的两个左右迁移的按钮就可以了,这样我们首先使我们的JTable位于我们自定义的JscrollPanel上,这个ScrollPanel需要我们自己定制.
首先定制的是它的Layout, JscrollPanel使用的是ScrollPaneLayout,我们需要继承这个Layout,使我们在corner位置可以容纳下我们的迁移Button.
/**
*thelayoutthatScrollPanewithbuttoninit.
*/
publicclass MyScrollPaneLayout extends ScrollPaneLayout {
首先是重写它的setVerticalScrollBarPolicy方法,保证Layout样式一直存在.
@Override
publicvoid setVerticalScrollBarPolicy(int x) {
// Used to set the vertical
scroll bar policy
super.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
}
然后重写layoutContainer方法,布置它的滚动窗格:
@Override
publicvoid
layoutContainer(Container parent) {
然后就是计算位置了,首先计算子级垂直滚动条的窗体,
Rectangle vsbR = new Rectangle(0, 0, 0, 0);
vsbR
= vsb.getBounds(vsbR);
接着计算子级列标题的窗体:
Rectangle colHeadR = new Rectangle(0, 0, 0, 0);
colHeadR = colHead.getBounds(colHeadR);
colHeadR.width -= vsbR.width;
colHead.getBounds(colHeadR);
最后是计算右上角显示的组件的窗体:
Rectangle upperRightR = upperRight.getBounds();
upperRightR.x -= vsbR.width;
upperRightR.width += vsbR.width + 1;
upperRight.setBounds(upperRightR);
接下来的类是重写我们的JtableHeader
/**
*Thisistheobjectwhichmanagestheheaderoftable
*/
privateclass LimitedTableHeader
extends JTableHeader
{
这个类比较简单,只是重写了方法,保证JtableHeader刷新时,左上角组件也刷新:
// actually, this is a not complete way. but easy one.
// you can see last column
painted wider, short time :)
// If you don't like this
kind cheap fake,
// you have to overwrite the
paint method in UI class.
@Override
publicvoid paintComponent(Graphics g) {
super.paintComponent(g);
columnButtonPane.repaint();
}
然后就是JscrollPanel左上角的组件了,说它之前是一个特别简单的类,把它的图片绘制出来:
/**
*paintthemenuitemimage.
*/
publicclass ArrowIcon implements Icon, SwingConstants {
方法都很简单,实现Icon接口的方法,绘制一个箭头图片:
@Override
publicvoid paintIcon(Component c, Graphics g, int x, int y) {
iconRenderer = new
BasicArrowButton(direction);
iconRenderer.paintTriangle(g, x, y, size, direction, isEnabled);
}
然后是绘制图片宽和高:
/**
*geticonWidth.
*/
@Override
publicint getIconWidth() {
switch (direction) {
caseNORTH:
caseSOUTH:
returniconSize;
caseEAST:
caseWEST:
returnsize;
}
returniconSize;
}
/**
*geticonheight.
*/
@Override
publicint getIconHeight() {
switch (direction) {
caseNORTH:
caseSOUTH:
returnsize;
caseEAST:
caseWEST:
returniconSize;
}
returnsize;
}
接着就是JscrollPane左上角组件的绘制了:
/**
*createthebuttonpanelthatintableheader.
*/
publicclass ColumnButtonPanel extends JPanel {
先看它的属性:
/**thepaneintable.*/
private JTable table = null;
这个是需要出现隐藏列的JTable.
/**thetablecolumnmodel.*/
private TableColumnModel cm = null;
这个是它们的列的实例.
/**showbutton.*/
private JButton revealButton = null;
/**hidebutton.*/
private JButton hideButton = null;
这两个是隐藏和显示列的按钮
/**savecolumnstack.*/
private
Stack<TableColumn> stack = null;
最后这个是存储所有列的堆栈.
咱就是初始化了,它初始化了Layout和Border:
setLayout(new GridLayout(1, 2));
setBorder(new LinesBorder(SystemColor.controlShadow, new Insets(0, 1, 0,
0)));
然后初始化属性:
stack = new Stack<TableColumn>();
table = header.getTable();
cm = table.getColumnModel();
创建两个按钮:
JButton button = new JButton();
// set icon.
button.setIcon(new ArrowIcon(iconHeight, direction, true));
button.setDisabledIcon(new ArrowIcon(iconHeight, direction, false));
设置按钮的事件和可用:
revealButton.addActionListener(new ActionListener() {
publicvoid actionPerformed(ActionEvent e) {
TableColumn column = (TableColumn) stack.pop();
cm.addColumn(column);
if (stack.empty()) {
revealButton.setEnabled(false);
}
hideButton.setEnabled(true);
table.sizeColumnsToFit(-1);
}
});
if (1 < cm.getColumnCount())
{
hideButton.setEnabled(true);
}
JscrollPanel左上角的组件这样就创建完成了.
其实还有一个类,主要是绘制左上角组件的边框
/**
*Aclassthatimplementsanemptyborderwithnosize.
*/
publicclass LinesBorder extends AbstractBorder implements SwingConstants {
它重写paintBorder方法、getBorderInsets、isBorderOpaque、getBorderInset
方法,通过边框和偏移计算最终的Border,参考Border的那个专题就可以了.
最后就是我们的MyScrollPane了,它继承JscrollPane.只要我们创立JTable时使用它,就可以使JTableHeader可以出现隐藏按钮:
/**
*Providesascrollableviewofalightweightcomponent.
*/
publicclass MyScrollPane extends JScrollPane {
看它的构造函数:
public
MyScrollPane(JTable table) {
先创建自己的JTableHeader,替换JTable原有的Header:
// set new header.
LimitedTableHeader header = new LimitedTableHeader(cm);
table.setTableHeader(header);
创建左上角组件,放置:
columnButtonPane = new
ColumnButtonPanel(header);
setCorner(UPPER_RIGHT_CORNER, columnButtonPane);
setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
最后是设置Layout:
// set layout.
MyScrollPaneLayout layout = new MyScrollPaneLayout();
setLayout(layout);
layout.syncWithScrollPane(this);
到此位置,创建JTableHeader显示隐藏按钮的所有代码就完成了,说是对JTableHeader的操作,倒不如说是在做JscrollPanel的重写.使用也很简单,当我们创建JTable的Panel时,原本使用
JScrollPane pane
= new JScrollPane(table);
现在使用
MyScrollPane
pane = new MyScrollPane(table);
就可以了,其它的都不会变.
分享到:
相关推荐
一行代码搞定layui数据表格的表头checkbox复选框隐藏问题。
HTML5_html表头固定不滚动而内容滚动的效果,表格是基于Div CSS实现的,将表头固定...在显示较多数据时,当用户滚动鼠标中轮时,表格内容会滚动,而表头固定不变,可以将表格内容与表头很好的对应,便于阅读表格内容。
可以实现表格排序和表头浮动效果的JavaScript脚本
用jquery实现的表格常用操作 1.表头固定 2.页脚求和 3.行隐藏 4.列隐藏 5.悬浮变色 6.表头排序
内容概要:QTableWidget自定义表头,占用多行数据,利用合并表格功能实现多行表头,使...实现思想:使用两个表格进行实现,一个表格充当表头,一个表格隐藏表头,充当表格项 其他说明:可根据项目情况进行自定义实现
提醒框,完毕后会自动隐藏 3.全面扫描Excel数据,将所有异常详细信息写入Excel,返回客户端,提供用户下载。方便修正错误数据。 4.支持大批量数据导入,经本人测试,3千条数据,只需短短2-5秒钟。 5.为正在此烦恼的...
QT QTableView QTableWidget 复杂表头(多行表头) 、(冻结、固定特定的行),具体效果看博客: https://blog.csdn.net/xiezhongyuan07/article/details/82857631
1.5 增加了 显示/隐藏功能,修正了非IE浏览器下列宽错位问题 1.6 修正了当有合并单元格时,锁定单元格错位的问题,修正了表格行数较多时的性能问题 1.7 表格单元格可以不指定宽度(锁定时,取实际的单元格宽度...
对于简单地表格,我们可以设置表头来满足我们的要求(当然也可以隐藏表头),不过对于定制化的表头,我们能做的不是特别多。特别是对于复杂的表头,使用自带的表头,无论怎么设置都不太可能达到需求。例如我最近接到...
如果输入的表格太长,自动将表格分片,并能设置表头,表尾 11). 支持文本水平、垂直排列,共9种对齐方式 12). 支持自动换行,上、下标,文本旋转,竖直文本,多行文本 13). 具有文本自动替换功能,能使CAD中...
1.5 增加了 显示/隐藏功能,修正了非IE浏览器下列宽错位问题 1.6 修正了当有合并单元格时,锁定单元格错位的问题,修正了表格行数较多时的性能问题 1.7 表格单元格可以不指定宽度(锁定时,取实际的单元格宽度),...
可拖动、排序的表格、内容超出隐藏。界面较精致,大家拿去就可以直接用了。
如果将内容显示在表格中,内容较多的情况下会出现垂直滚动条,在向下滚动时,表头会被隐藏,这对查看内容非常不便,一个解决办法是,采用上下两个放在不同div中的表,上面的专门放表头,下面的显示详细内容。...
http://blog.csdn.net/tianxiawudi0720/article/details/47401399
动态创建表格(Html格式),支持横向统计与纵向统计,支持隐藏表头
隐藏表格边框的设置! 很值得下载看看!资源免费,大家分享!!
给 layui-table 注入点灵魂 ...左右拖动调整顺序,鼠标移出表格后松开--快速隐藏列 4.子表 快速上手 1.将下面模块放到自己项目中: soulTable.js 总入口 tableFilter.js 表头筛选 excel.js excel导出 tableChild.js 子表
我就废话不多说了,直接上关键代码吧!给大家做个参考 layui.use(['table','form','laypage'], ... id:"item",//用作于隐藏列名为item的列 elem: '#QD', url:path+'test.do', cols: [[ //表头 {field: '
因为项目需要有个小功能,控制小眼睛睁眼闭眼实现密码的可读还是隐藏。亲身使用总结,有问题可以随时联系我。
分别对两种不同的下拉复选框控件,结合表格实现了:选中了下拉复选框中的哪一项,表格的表头就显示那一列。不打钩的默认隐藏。对于一个表头很大的表格来说很实用噢。