Excel表格有一种功能,就是在你双击表头的分隔线时,会根据表格中内容自动调整列宽,使该列的数据可以完全显示出来。Swing的JTable里如何实现这个功能呢?
如果你看过Swing hacker里,应该见过里面根据列中内容自动调整列宽的方法。这个方法可以拿过来借用一下,那么剩下的就是如何监听到表格头分隔线上的双击事件了。
API里没有这方面的信息,通过观察表格的行为可以发现,当鼠标处于两列之间的分隔线上时,鼠标会变成左右调整的形状,那么我们就可以在鼠标监听里,通过当前的表头鼠标的样式来判断是否在两列之间的分割线上点击了鼠标。
/**
* 添加列表自动调整的监听器,当双击表头不同列间的分隔线时,
* 自动将分隔线左侧的列宽进行调整,使其内容可完全显示
*/
private void addColumnResizeListener() {
tableHeader = jTable1.getTableHeader();
tableHeader.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// 当光标处于两个列表间的分隔线上时,表头的光标呈东西调整的样式,通过
// 鼠标的样式和点击次数来判断是否需要进行列宽调整
int cursorType = tableHeader.getCursor().getType();
if (cursorType == Cursor.E_RESIZE_CURSOR || cursorType == Cursor.W_RESIZE_CURSOR) {
if (e.getClickCount() == 2) {
// 获取光标点击位置的列号,这里将X的坐标减去3个像素,是为了保证取到的点始终是分隔线前的列号
int col = jTable1.getTableHeader().getColumnModel().getColumnIndexAtX(e.getX() - 3);
adjustColumnPreferredWidths(jTable1, col);
}
}
}
});
}
通过上面的方法就可以得到表格的列分隔线处的双击事件啦,下面就剩下调整列宽的事情了,将Swing Hacker里的代码稍作修改一下:
/**
* 根据给定的列号调整表格的列宽,此算法取自Swing hacker,不多说啦
* @param table
* @param col
*/
public static void adjustColumnPreferredWidths(JTable table, int col) {
// strategy - get max width for cells in column and
// make that the preferred width
TableColumnModel columnModel = table.getColumnModel();
int maxwidth = 0;
for (int row = 0; row < table.getRowCount(); row++) {
TableCellRenderer rend =
table.getCellRenderer(row, col);
Object value = table.getValueAt(row, col);
Component comp =
rend.getTableCellRendererComponent(table,
value,
false,
false,
row,
col);
maxwidth = Math.max(comp.getPreferredSize().width, maxwidth);
} // for row
TableColumn column = columnModel.getColumn(col);
column.setPreferredWidth(maxwidth + 3);
}
通过上面的方法就可以完成Excel表格的类似的功能了。看看附图中的效果
- 大小: 23.5 KB
- src.zip (3.7 KB)
- 描述: 源码及Netbean的界面文件
- 下载次数: 150
分享到:
相关推荐
pb9写的,获得数据窗口双击两列之间的空隙得到前一列的最大列宽,然后通过api获得文本宽度(不是len,是GetTextExtentPoint32,此函数功能:计算指定的正文字符串的高度和宽度),最后modify实现标题所示功能。
表格表头动态排序插件 Js表格插件,用户在操作的时候,双击表头即可实现某一列数据的排序。本表格排序插件的核心JS文件并不臃肿,因此网页调用后,加载速度比较多,而且样式上也更加美观,适合用于JS报表环境 。
双击MSFlexGrid表头实现排序,,双击MSFlexGrid表头实现排序
VC 利用列标题对列表视图进行数据排序,也就是双击表头排序,这在实际应用中是非常常见的一种数据列表排序方式,大家都已经熟悉了这种排序方式,在VC 中实现起来也并不复杂,你可下载本源码学习参考。
MFC实现listCtrl双击表格,实现对表格的文本输入。
此资源经过多次修改,最终完成table双击自动编辑,支持input select 等,用法简单,快速集成到项目中,达到双击变文本框即时编辑内容
一个十分有用的软件,在表格中要用大量复制和粘贴时,它的作用就很大了,只需要双击即可实现快速复制或粘贴,跨软件使用那就仅简化复制或粘贴其中一个功能,仅在表格中使用就可以完全不用键盘来复制和粘贴了
怎么实现在表格中双击两下就可对里面的内容进行修改
Labview“写入测量文件(Excel)”设置表头解决方案(初次试探) 利用For循环连续读取数据,将数组转换为动态数据,设置单路动态数据的属性,然后合并多路信号(相当于填入Excel某sheet中不同列),然后利用”写入...
jquery php+mysql 表格双击可编辑,表单失去焦点自动提交保存数据,很实用!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
硬盘双击自动播放怎么办,硬盘双击自动播放怎么办,硬盘双击自动播放怎么办
动态删除表格行、列、双击编辑.rar动态删除表格行、列、双击编辑.rar动态删除表格行、列、双击编辑.rar动态删除表格行、列、双击编辑.rar
主要介绍了VUE页面中通过双击实现复制表格中内容,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
双击页面自动滚屏效果
安卓控件单击、双击事件共存,下载附件运行即可
8.双击自适应列宽 9.右侧固定列 列宽拖动改到单元格左侧 效果 1.表头筛选效果 2.编辑筛选效果 筛选明代姓张的 或 唐代姓李的的诗词 3.拖动列调整顺序、隐藏显示列 左右拖动调整顺序,鼠标移出表格后松开--快速隐藏列...
NULL 博文链接:https://pireswang.iteye.com/blog/325568
实现双击自动滚屏的JS代码 实现双击自动滚屏的JS代码 实现双击自动滚屏的JS代码
Html 双击自动滚屏代码Html 双击自动滚屏代码
vue+elementTable每行多个单元格双击修改 绑定@cell-dblclick双击事件,显示input进行修改,失焦绑定@blur事件