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
相关产品推荐
相关产品推荐

