创建粗体单元格边框线JTable

时间:2017-05-04 16:41:52

标签: java swing jtable

我试图创建一个数独游戏,但我无法创建粗线来将其分成3 x 3块。我最近的尝试是使用JLabel将图像强加到桌面上。问题是标签完全覆盖了JTable。我愚蠢地设置了标签和桌子的不透明度而没有运气。以下是一些图片来展示我的目标:

目前看:

enter image description here

目标:

enter image description here

如果您可以告诉我可以用来创建这些线的方法,我们将不胜感激。没有直接的答案,只是朝着正确的方向发展。

2 个答案:

答案 0 :(得分:2)

结帐Table Row Rendering

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

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

答案 1 :(得分:2)

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

对于此GUI中的边框,我将使用一个包含9个网格布局的3 x 3组,每个布局都有LineBorder。默认情况下,边框将围绕显示的面板的所有四个边缘,但是它们与边框相交的位置将是双倍宽度,从而接近重新创建第二个图像。

E.G。

enter image description here

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);
    }
}