如何使 GridBagLayout 特定大小?

How to make GridBagLayout specific size?

目前我有一个 9x9 的文本字段网格,使用 GridBayLayout。因为网格使每个文本字段的长度比它的高度略长(即使我为文本字段设置了特定的高度),所以网格是一个矩形,而不是正方形。

如何使整个网格具有特定大小,或者网格内的每个文本字段具有特定大小?

编辑:我需要 9 x 9 的文本字段网格是方形的,而不是矩形的。

问题在于调整大小提示,方法 [get/set][Minimum/Maximum/Preferred]Size 告诉布局管理器组件想要的大小,布局管理器有时会忽略它,有时他们不会。 GridBagLayout 尊重这一点,你的 JTextFields 告诉他他们想要长方形。如何 JTextFields 弄清楚他们想要的尺寸是各种困难,所以让我们忽略它。

如果您想确保所有 JTextFields 大小相同,您应该覆盖这些方法。 Subclass JTextField 并制作如下内容:

final class SquareJTextField extends JTextField {
    private static Dimension maxDimension = new Dimension(0, 0);

    @Override
    public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        // take the larger value
        int max = d.width > d.height ? d.width : d.height;
        // compare it against our static dimension
        // height je rovnaky ako width
        if (max > maxDimension.width)
            maxDimension = new Dimension(max, max);
        // return copy so no one can change the private one
        return new Dimension(maxDimension);
    }

    @Override
    public Dimension getMinimumSize() {
        Dimension d = super.getPreferredSize();
        int max = d.width > d.height ? d.width : d.height;
        if (max > maxDimension.width)
            maxDimension = new Dimension(max, max);
        return new Dimension(maxDimension);
    }

    @Override
    public Dimension getMaximumSize() {
        Dimension d = super.getPreferredSize();
        int max = d.width > d.height ? d.width : d.height;
        if (max > maxDimension.width)
            maxDimension = new Dimension(max, max);
        return new Dimension(maxDimension);
    }
}

此 class 的所有对象应具有相同的尺寸且应为正方形。

将网格中的 JtextFields 替换为 SquareJTextField