如何移除JTable中每隔4行的粗横线及第三列旁的粗竖线
问题原因
你看到的两类粗分隔线都不是JTable原生的1px标准网格线,是配置不当导致的视觉叠加:
- 间隔出现的粗横向分隔线:手动硬编码计算滚动面板高度时存在像素偏差,加上单元格默认自带边框和表格网格线重叠,最终显示为2px粗线
- 第三列侧边的粗纵向分隔线:当前代码只定义了3列,列总宽度和滚动面板视口宽度不匹配时,最后一列会自动拉伸,列边缘、视口边框、网格线三者重叠,就会显示为粗线
修复方案
按顺序添加以下配置即可统一所有分隔线宽度为1px:
1. 配置全局网格线基础规则
先统一网格线参数,从根源避免间距异常:
// 统一单元格横竖间距为1px,保证网格线基础宽度一致 table.setIntercellSpacing(new Dimension(1, 1)); table.setShowHorizontalLines(true); table.setShowVerticalLines(true); // 关闭最后一列单独拉伸模式,避免最后一列宽度异常导致侧边叠线 table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
2. 替换硬编码的尺寸计算逻辑
原代码里手动写死的+23表头高度是不准确的,不同系统、不同主题下的表头高度、边框占比不是固定值,像素差1px就可能导致叠线。用组件自带的尺寸计算方法替换原有滚动面板尺寸设置代码:
// 自动计算表头高度,无需硬编码固定值 int headerHeight = table.getTableHeader().getPreferredSize().height; // 最多展示13行内容,超出则显示滚动条 int showRowCount = Math.min(data.length, 13); int rowTotalHeight = table.getRowHeight() * showRowCount; int viewportHeight = headerHeight + rowTotalHeight; // 直接给视口设置尺寸,避免滚动面板自身边框干扰计算 scrollPane.getViewport().setPreferredSize(new Dimension(scrollPane.getPreferredSize().width, viewportHeight));
3. 统一单元格和表头的边框
Swing默认的单元格渲染器自带焦点边框、默认边距,很容易和表格网格线叠成粗线,统一配置渲染器边框即可解决:
// 统一内容单元格边框,移除默认自带边框,可根据需要调整左右内边距 table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); ((JComponent) comp).setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 2)); return comp; } }); // 统一表头单元格边框,避免表头和首行之间出现粗线 table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); ((JComponent) comp).setBorder(BorderFactory.createMatteBorder(0, 0, 1, 1, table.getGridColor())); setHorizontalAlignment(SwingConstants.CENTER); return comp; } });
内容的提问来源于stack exchange,提问作者Henrick
相关产品推荐
相关产品推荐

