Java 创建粗体单元格边框线JTable

Java 创建粗体单元格边框线JTable,java,swing,jtable,Java,Swing,Jtable,我正在尝试创建一个数独游戏,但在创建粗体线条以将其划分为3 x 3个区块时遇到了问题。我最近的尝试是使用JLabel在表的顶部添加一个图像。问题是标签完全覆盖了JTable。我在设置标签和桌子的不透明度时胡闹了一番,运气不好。以下是一些图片,展示我的目标: 当前的外观: 目标是: 如果您能给我一个方法,我可以使用创建这些线,它将非常感谢。无需直接回答,只需指向正确的方向。查看 它显示了如何为行中的每个单元格提供自定义的边框 因此,您需要修改代码,根据渲染的单元格提供多个不同的边框。签出 它显

我正在尝试创建一个数独游戏,但在创建粗体线条以将其划分为3 x 3个区块时遇到了问题。我最近的尝试是使用
JLabel
在表的顶部添加一个图像。问题是标签完全覆盖了
JTable
。我在设置标签和桌子的不透明度时胡闹了一番,运气不好。以下是一些图片,展示我的目标:

当前的外观:

目标是:

如果您能给我一个方法,我可以使用创建这些线,它将非常感谢。无需直接回答,只需指向正确的方向。

查看

它显示了如何为行中的每个单元格提供自定义的
边框

因此,您需要修改代码,根据渲染的单元格提供多个不同的边框。

签出

它显示了如何为行中的每个单元格提供自定义的
边框


因此,您需要修改代码以根据渲染的单元格提供多个不同的边框。

对于任何棋盘游戏,我倾向于使用网格布局(或一组网格布局)中的按钮,如或

不过,对于这个GUI中的边框,我会使用一个3 x 3组的九个网格布局,每个布局都有一个
LineBorder
。默认情况下,边框将环绕显示在其中的面板的所有四个边,但它们与边框相交的位置将是两倍宽度,从而接近于重新创建第二个图像

例如

import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.*;
导入java.util.*;
公务舱所渡子{
私有JComponent ui=null;
索杜科(){
initUI();
}
public void initUI(){
如果(ui!=null)返回;
ui=新的JPanel(新的GridLayout(3,3));
ui.新订单(新的空订单(4,4,4,4));
ArrayList值=新的ArrayList();

对于(intii=0;ii对于任何棋盘游戏,我倾向于使用网格布局(或一组网格布局)中的按钮,如或

不过,对于这个GUI中的边框,我会使用一组3 x 3的九个网格布局,每个布局都有一个
LineBorder
。默认情况下,边框会环绕显示在其中的面板的所有四个侧面,但它们与边框相交的位置将是两倍宽度,从而接近于重新创建第二个图像

例如

import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.*;
导入java.util.*;
公务舱所渡子{
私有JComponent ui=null;
索杜科(){
initUI();
}
public void initUI(){
如果(ui!=null)返回;
ui=新的JPanel(新的GridLayout(3,3));
ui.新订单(新的空订单(4,4,4,4));
ArrayList值=新的ArrayList();

对于(int ii=0;ii)将图像上载到论坛,以便它们可以显示在您的问题中。对于任何棋盘游戏,我倾向于使用网格布局(或一组网格布局)中的按钮就像在或中一样。但是对于这个GUI中的boarders,我会使用一个3 x 3组,共九个网格布局,每个布局都有一个
LineBorder
。默认情况下,边框会环绕它所显示的面板的所有四个面,但是它们与边框相交的地方会是两倍宽度,从而接近于重新创建第二个图像。上传图像对于任何棋盘游戏,我倾向于使用网格布局(或一组网格布局)中的按钮就像在或中一样。但是对于这个GUI中的边界,我会使用一个3 x 3组,共九个网格布局,每个布局都有一个
线边框
。默认情况下,边框会环绕它所显示的面板的所有四个面,但它们与边框相交的地方会是两倍宽度,从而接近于重新创建第二个图像。另请参见此view。另请参见此视图。
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.*;

public class Soduko {

    private JComponent ui = null;

    Soduko() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new GridLayout(3,3));
        ui.setBorder(new EmptyBorder(4,4,4,4));

        ArrayList<Integer> values = new ArrayList<>();
        for (int ii=0; ii<34; ii++) {
            values.add(0);
        }
        Random r = new Random();
        for (int ii=34; ii<81; ii++) {
            values.add(r.nextInt(9)+1);
        }
        Collections.shuffle(values);
        int count=0;
        for (int ii=0; ii<9; ii++) {
            JPanel p = new JPanel(new GridLayout(3, 3));
            p.setBorder(new LineBorder(Color.BLACK, 2));
            ui.add(p);
            for (int jj=0; jj<9; jj++) {
                int v = values.get(count++).intValue();
                String s = v>0 ? "" + v : "";
                p.add(new JButton(s));
            }
        }
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                Soduko o = new Soduko();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}