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

Java Swing中Insets转数组方法及数独风格JTable网格边框设置问题

Java Swing中Insets转数组方法及数独风格JTable网格边框设置问题

首先解决你提到的Insets访问问题:你其实不用把它转成数组,Insets类的top、left、bottom、right都是公共实例字段,可以直接读取使用,比如:

Insets insets = comp.getInsets();
int currentTop = insets.top;
int currentLeft = insets.left;
// 同理可以获取bottom和right

接下来针对你的数独网格边框需求,核心问题是你之前的代码每次设置边框都会完全替换掉之前的,导致行和列的边框互相覆盖。这里有两种更优雅的解决方案:


方案一:一次性计算四边厚度,直接创建完整边框

不用分多次设置列边框和行边框,而是根据单元格的行、列位置,一次性计算出四个边的边框厚度,然后创建包含所有需求的MatteBorder,从根源避免覆盖问题。

示例代码(贴合数独网格的逻辑)

private static class SudokuCellRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        // 先调用父类方法获取默认渲染组件
        JComponent cell = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        
        // 计算四个边的边框厚度:数独风格,每3行/列的边界用粗线,内部用细线
        int top = (row % 3 == 0) ? 2 : 1;    // 第0、3、6行的上边框加粗
        int left = (column % 3 == 0) ? 2 : 1; // 第0、3、6列的左边框加粗
        int bottom = (row == 8 || row % 3 == 2) ? 2 : 1; // 第8行下边框加粗,第2、5行下边框(3x3块的底部)加粗
        int right = (column == 8 || column % 3 == 2) ? 2 : 1; // 第8列右边框加粗,第2、5列右边框(3x3块的右侧)加粗
        
        // 创建包含所有边框设置的MatteBorder
        Border cellBorder = BorderFactory.createMatteBorder(
            top, left, bottom, right, 
            Color.BLACK
        );
        
        cell.setBorder(cellBorder);
        return cell;
    }
}

方案二:基于现有边框叠加修改

如果你想保留单元格的默认边框样式,再叠加数独的粗线边框,可以先读取现有边框的Insets,修改需要加粗的边的厚度,再创建新边框:

private static class SudokuCellRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JComponent cell = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        
        // 获取当前单元格的默认边框Insets
        Insets insets = cell.getInsets();
        
        // 初始化四边厚度为默认值
        int top = insets.top;
        int left = insets.left;
        int bottom = insets.bottom;
        int right = insets.right;
        
        // 根据数独规则修改对应边的厚度
        if (row % 3 == 0) top = 2;
        if (column % 3 == 0) left = 2;
        if (row == 8 || row % 3 == 2) bottom = 2;
        if (column == 8 || column % 3 == 2) right = 2;
        
        // 创建新的边框并设置
        Border cellBorder = BorderFactory.createMatteBorder(top, left, bottom, right, Color.BLACK);
        cell.setBorder(cellBorder);
        
        return cell;
    }
}

最后需要注意的配置

为了让自定义边框完全生效,建议关闭JTable的默认网格线,并清除单元格间距:

JTable sudokuTable = new JTable(9, 9);
sudokuTable.setShowGrid(false);
sudokuTable.setIntercellSpacing(new Dimension(0, 0));

// 将自定义渲染器设置给所有列
for (int col = 0; col < 9; col++) {
    sudokuTable.getColumnModel().getColumn(col).setCellRenderer(new SudokuCellRenderer());
}

这样就能实现你想要的数独风格9x9网格,粗线分隔3x3区块,且不会出现边框互相覆盖的问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:29:34