将小数字添加到 table 或网格中每个单元格角的最佳方法是什么?

What is the best way to add small numbers to the corner of each cell in a table or grid?

我正在尝试制作一个涉及 10x10 网格的简单游戏,其中网格中的每个单元格都需要在中心包含一个大字母,在其中一个角包含一个小数字。像这样:

目前,我的最佳想法涉及制作 100 个不同的 JLabel 组件,对应于从 jLabel00 到 jLabel99 的每个单元格,并使用 null 布局手动将它们分层到底部 -每个单元格的右上角一个Table。但是,即使我将标签添加到 ArrayList(假设我 可以 甚至这样做,这也会在我的代码和 UI 中造成很多重复).

有人知道更优雅的解决方案吗?

可以使用 'cells' 的 GridBagLayoutGridLayout 将这些单元格排列成行来轻松实现上面看到的那种布局。该代码可以使用工厂方法来生成单元格。字母可能需要一个数字和一个 char 或单个字符 String。此代码 'cheats' 假设数字是 Unicode 代码点。

这是制作电池板的方法:

private JPanel getCellPanel(int i) {
    JPanel p = new JPanel(new GridBagLayout());
    p.setBorder(new LineBorder(Color.BLACK));
    GridBagConstraints gbc = new GridBagConstraints();

    JLabel l1 = new JLabel(new String(Character.toChars(i)));
    l1.setFont(l1.getFont().deriveFont(30f));
    gbc.gridx = 0;
    gbc.gridy = 0;
    p.add(l1, gbc);

    JLabel l2 = new JLabel();
    gbc.gridx = 0;
    gbc.gridy = 1;
    p.add(l2, gbc);

    JLabel l3 = new JLabel();
    gbc.gridx = 1;
    gbc.gridy = 0;
    p.add(l3, gbc);

    JLabel l4 = new JLabel(new String("" + i));
    l4.setFont(l4.getFont().deriveFont(12f));
    gbc.gridx = 1;
    gbc.gridy = 1;
    p.add(l4, gbc);

    return p;
}

完整源码:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class BigLetterLittleNumber {

    private JComponent ui = null;

    BigLetterLittleNumber() {
        initUI();
    }

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

        ui = new JPanel(new GridLayout(0, 13, 2, 2));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));
        for (int ii=65; ii<91; ii++) {
            ui.add(getCellPanel(ii));
        }
    }

    private JPanel getCellPanel(int i) {
        JPanel p = new JPanel(new GridBagLayout());
        p.setBorder(new LineBorder(Color.BLACK));
        GridBagConstraints gbc = new GridBagConstraints();

        JLabel l1 = new JLabel(new String(Character.toChars(i)));
        l1.setFont(l1.getFont().deriveFont(30f));
        gbc.gridx = 0;
        gbc.gridy = 0;
        p.add(l1, gbc);

        JLabel l2 = new JLabel();
        gbc.gridx = 0;
        gbc.gridy = 1;
        p.add(l2, gbc);

        JLabel l3 = new JLabel();
        gbc.gridx = 1;
        gbc.gridy = 0;
        p.add(l3, gbc);

        JLabel l4 = new JLabel(new String("" + i));
        l4.setFont(l4.getFont().deriveFont(12f));
        gbc.gridx = 1;
        gbc.gridy = 1;
        p.add(l4, gbc);

        return p;
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                BigLetterLittleNumber o = new BigLetterLittleNumber();

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