Java网格包布局:避免居中对齐

4

在我的GUI应用程序中,我有几个JPanel在程序运行的不同时间点被实例化,某些操作会导致其中一个在滚动面板中显示:

mViewport.setViewportView(currentPanel);

问题是,我的面板使用网格包布局完成,它的行为是在其所在的JScrollPane中心对齐。这会使GUI看起来很奇怪。
有人知道强制网格包布局面板左上对齐的方法吗?
谢谢!
编辑
请注意,我在此询问整个面板在其滚动窗格内的对齐方式,而不是面板内组件的对齐方式。

你能否为我们发布一些可行的代码? - willcodejavaforfood
@willcodejavaforfood,那是与问题相关的唯一代码行。JPanel的代码只是标准的NetBeans自动生成代码。 - bguiz
我更倾向于一个可以快速复制粘贴并自己尝试的工作示例。显然,与那一行代码相比,还有很多相关的内容 :) - willcodejavaforfood
@willcodejavaforfood,感谢您的评论。由于这是一个庞大的类,所以在发布其余部分时存在很多惯性...无论如何,请查看我的答案。 - bguiz
2个回答

8
您需要在面板内的一个或多个组件上设置权重(在GridBagConstraints中)。这会使组件“推”来占用更多可用空间(如果没有权重,组件只会占用所需空间,并且面板将居中于可用空间)。
如果您想将组件对齐到滚动窗格的左上角,请将底部组件的y权重设置为1.0,并将最右侧组件的x权重设置为1.0。

@Ash,感谢您的回答,不幸的是,在我的特定应用程序中似乎没有起作用。我已经找到了替代方案并回答了自己的问题。 - bguiz
为了不使我的组件变形,我在一个新的底行和一个新的右列中添加了一个空标签,其x和y权重设置为1。...感谢您的回答! - Kai

6

在一些试验之后,我找到了自己问题的解决方案:

设置权重似乎能够影响使用GridBagLayoutJPanel中组件的对齐方式。然而,它没有影响JScrollPaneJPanel的对齐方式。

我找到了一个相当简单的解决方案,即不要像之前的代码那样直接将JPanel放入JScrollPane中:

if (currentPanel != mCurrentPanel)
{
    mViewport.setViewportView(currentPanel);
}

相反地,应该在JScrollPane内部放置一个“外部”JPanel,并将其设置为使用FlowLayout。然后,当我想要切换面板时,我会移除旧的面板,并将面板放置在“外部”面板中。

if (currentPanel != mCurrentPanel)
{
    if (mCurrentPanel != null)
    {
        mOuterPanel.remove(mCurrentPanel);
    }
    mCurrentPanel = currentPanel;
    mOuterPanel.add(mCurrentPanel);
}

这种方法非常有效,因为它意味着我只需要在一个类中进行更改,而不是每个面板都要更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接