【问题标题】:What is the best way to add small numbers to the corner of each cell in a table or grid?将小数字添加到表格或网格中每个单元格的角落的最佳方法是什么?
【发布时间】:2021-10-15 05:26:37
【问题描述】:

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

目前,我的最佳想法是制作 100 个不同的 JLabel 组件,它们对应于从 jLabel00 到 jLabel99 的每个单元格,并使用 null 布局手动将它们分层到每个单元格的右下角一张桌子。但是,即使我将标签添加到ArrayList,这也会导致我的代码和 UI 出现大量重复(假设我可以甚至这样做)。

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

【问题讨论】:

  • 使用绘图 JPanel 创建网格、字母和数字。 Oracle 教程Performing Custom Painting 将向您展示如何操作。
  • 一些想法被检查here。
  • 提供 ASCII 艺术或一个简单的 intended 布局的单元格的最小尺寸,如果可调整大小,具有更大的宽度和高度 - 显示如何应该使用额外的空间。我最感兴趣的是“小数字”是否可能完全在大字母的最右端和最底端之外。如果是这样,使用带有四个单元格的GridBagLayout 很简单,其中只有两个(左上角和右下角)包含可见元素。
  • 那个GBL建议可能look like this..
  • 这是single cell。这个数字只需要一个空间来容纳一个数字,我对它看起来如何调整大小并不挑剔,甚至可以调整大小。我想如果我必须将字母保持在中心,但将数字与边框一起移动?无论如何,您的 GBL 示例看起来很完美。我会了解它,并在下次有机会从事它的时候尝试一下。万分感谢! @安德鲁汤普森

标签: java swing jpanel jlabel


【解决方案1】:

使用GridBagLayout 表示“单元格”,使用GridLayout 将这些单元格排列成行,可以轻松实现上述布局。该代码可以使用工厂方法来生成单元。字母可能需要一个数字和一个char 或单个字符String。此代码通过假设数字是 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2012-08-02
    • 2014-09-10
    • 2018-10-04
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多