java - GridBagLayout:面板延伸到其他面板之上

标签 java swing jpanel layout-manager gridbaglayout

我正在尝试创建具有以下面板布局的 UI:

http://i.imgur.com/jrYUxRO.jpg

但是,当我用图像(位于 JLabels 上)填充白色面板时,会发生以下情况:

http://i.imgur.com/3ECRndH.jpg

问题是否是图像本身没有调整大小以使面板“适合”?如果是这样,是否可以轻松调整它们的大小,或者我是否必须找到 GridBag 分配给它的大小,然后根据该大小缩放每个图像?

编辑:我在这里尝试做的是在实际添加图像时保持面板 1(白色)与第一张图片中的尺寸相同。 我不希望面板调整大小并接管其他一些面板。

    GridBagLayout gb = new GridBagLayout();
    gb.columnWeights = new double[] {0.25,0.25,0.25,0.25};
    gb.rowWeights = new double[] {0.5,0.5};
    setLayout(gb);
    GridBagConstraints gc = new GridBagConstraints();

    gc.fill = GridBagConstraints.BOTH;

    gc.gridx = 0;
    gc.gridy = 0;
    gc.gridwidth = 3;
    add(new WhitePanel(), gc);

    gc.gridx = 3;
    gc.gridy = 0;
    gc.gridwidth = 1;
    add(new RedPanel(), gc);

    gc.gridx = 0;
    gc.gridy = 1;
    gc.gridwidth = 1;
    add(new GreenPanel(), gc);

    gc.gridx = 1;
    gc.gridy = 1;
    gc.gridwidth = 2;
    add(new BluePanel(), gc);

    gc.gridx = 3;
    gc.gridy = 1;
    gc.gridwidth = 1;
    add(new YellowPanel(), gc);

以下是我的 WhitePanel 构造函数:

    public WhitePanel()
    {
        setBackground(new Color(1f,1f,1f,1f));

        setLayout(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        gc.gridx = 0;
        gc.gridy = 0;
        gc.weightx = 1;
        gc.weighty = 1;
        gc.anchor = GridBagConstraints.CENTER;

        for (int type = 0; type < 4; type++)
        {
            for (int tier = 0; tier < 7; tier++)
            {
                gems[type][tier] = new D3Gem(type, tier, 0);
                add(new JLabel(new ImageIcon(gems[type][tier].getImage())),gc);
                gc.gridx++;
            }
            gc.gridx = 0;
            gc.gridy++;
        }
    }

编辑编辑:我希望白色面板保持相同的大小,并希望 JLabels 本身调整大小(即缩小标签之间的空白空间)以适合该面板。

注意:如果我没有行gc.fill = GridBagConstraints.BOTH;,那么白色面板上的图像仅占据白色面板的一小部分(足以使它们不重叠)。因此,我认为 gc.fill = GridBagConstraints.BOTH; 将完美填充白色面板。

“解决方案”编辑:好吧,我似乎有一个解决方案,尽管是一个不稳定的解决方案。我只是将 setPreferredSize(new Dimension(1,1)); 附加到白色面板的构造函数中,结果它保持了我想要的大小。如果有人愿意详细说明发生了什么,我将不胜感激:)

最佳答案

您可以为红色(或黄色)面板的 GridBagConstraint 定义 ipadx

来自javadoc

/**
 * This field specifies the internal padding of the component, how much
 * space to add to the minimum width of the component. The width of
 * the component is at least its minimum width plus
 * <code>ipadx</code> pixels.
 * <p>
 * The default value is <code>0</code>.
 * @serial
 * @see #clone()
 * @see java.awt.GridBagConstraints#ipady
 */
public int ipadx;

关于java - GridBagLayout:面板延伸到其他面板之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687760/

相关文章:

java - Teradata JDBC 创建 volatile 表错误 3585

java - 我可以使用 FlowLayout 在 JPanel 中获取多行吗

Java Swing 。从 JButton 打开一个新的 JPanel 并使按钮变得漂亮

java - 如何用 Java 重新绘制面板?

java - 简单的可点击 Swing 'grid' 鼠标事件似乎不准确

Java根据条件计算计数

java - android.view.InflateException : Binary XML file line #34: Error inflating class AutoFitTextureView

java - Lucene 4.3.0 的简单测试代码不起作用

java - Swing-TextArea.append 未触发

java - Java 中更快的 2D 渲染