You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 10:27:08