如何使GridBagLayout具体大小?

时间:2018-02-05 13:27:10

标签: java swing layout-manager gridbaglayout

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

如何使整个网格成为特定尺寸,或者网格内的每个文本字段都是特定尺寸?

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

1 个答案:

答案 0 :(得分:1)

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

如果您想确保所有JTextFields的大小相同,则应覆盖这些方法。子类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);
    }
}

此类的所有对象应该是相同的维度,并且应该是正方形。

使用JtextFields

替换网格中的SquareJTextField