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
分享到:
相关推荐
根据“自动调整”子菜单可对表格调整的项目有:“根据内容调整表格”、“根据窗口调整表格”、“固定列宽”、“平均分布各列”、“平均分布各行”等。 精确调整表格 可能有时还得用鼠标手工调整表格边线,但操作...
- "最适合的列宽":双击列与列之间的分隔线或双击表格最左侧边框线。 - "平均分布":"表格" -> "自动调整" -> "平均分布各行"或"各列",也可使用"表格和边框"工具栏中的相应按钮。 - **合并单元格**:选中多个...
- 如果需要调整列宽或行高,可以双击列标或行标之间的分隔线。 **7. 彻底清除单元格内容** 要彻底清除单元格内容,可以采取以下步骤: - 选中需要清除的单元格。 - 右键选择“清除内容”或“清除格式”。 - 或者...
6. 分栏:选定文字,使用“格式”菜单的“分栏”功能,设置栏数、栏宽和分隔线。 7. 复制和移动段落:选定后,使用“编辑”菜单的“复制/剪切”和“粘贴”命令。 8. 合并段落:通过删除或退格键实现。 9. 首字下沉:...
- 双击两个单元格之间的分隔线可以快速选择包含这些单元格在内的整个区域。 **22. 快速选定不连续单元格** - 使用 `Ctrl + 鼠标单击` 来选择不连续的单元格。 **23. 根据条件选择单元格** - 使用“条件格式”功能...
- **分栏**:使用“格式”>“分栏”设置栏数、栏宽和分隔线。 - **复制与移动**:选定内容,使用“编辑”>“复制/剪切”和“粘贴”命令。 - **首字下沉**:通过“格式”>“首字下沉”调整段首字符位置。 - **...
1. **表格**:在Markdown中,你可以使用`|`定义表格,`-`定义表头分隔线,通过空格调整列宽。 2. **代码块**:使用三个反引号(```)加上语言名称可以创建代码块,例如:```python,然后输入Python代码。 3. **插入...
20. **双击单元格某边**:双击左侧或上方边框可调整列宽或行高。 21. **快速选定不连续单元格**:按Ctrl键逐个点击所需单元格。 22. **根据条件选择单元格**:使用“查找与选择”中的“定位条件”功能。 23. **复制...
- 双击单元格边界可以自动调整列宽,使其适应内容长度。 **21. 双击单元格某边选取单元格区域** - 双击单元格的上下左右边缘可以快速选中整行或整列。 **22. 快速选定不连续单元格** - 按住`Ctrl`键,然后...
- 双击单元格边缘可以自动扩展选定范围至包含相似数据的区域。 **22. 快速选定不连续单元格** - 按住 `Ctrl` 键,单击想要选定的单元格。 **23. 根据条件选择单元格** - 使用“条件格式”功能选择符合特定条件的...
修改高级表格支持库,通过鼠标调整行高列宽时不改变当前光标行列号。 8. 修改BUG:在IDE中打开源代码文件(.e)后,高级选择夹组件不能正确切换到“现行子夹”属性设定的子夹。 9. 修改BUG:矢量动画支持库中的...