java网格包布局:避免中心对齐

时间:2010-01-20 05:26:46

标签: java alignment jpanel jscrollpane gridbaglayout

在我的GUI应用程序中,我有几个JPanel,它们在我的程序运行期间的各个点被实例化,并且某些操作将导致其中一个显示在滚动窗格中:

mViewport.setViewportView(currentPanel);

麻烦的是,我的面板是使用Grid Bag Layouts完成的,其行为是将其自身置于其内部的JScrollPane中。这使得GUI看起来很奇怪。

任何人都知道强制网格包布局面板左上角对齐的方法吗?

谢谢!


修改

请注意,我在这里询问整个面板在其滚动窗格中的对齐方式,而不是面板内的组件。

2 个答案:

答案 0 :(得分:8)

您需要在面板内的一个或多个组件上设置权重(在GridBagConstraints中)。这具有“推动”组件以占用更多可用空间的效果(没有重量,组件将只占用他们需要的东西,并且面板将在可用空间内居中)。

如果要对齐滚动窗格左上角的组件,请将底部组件的y权重设置为1.0,并将最右侧组件的x权重设置为1.0。

答案 1 :(得分:6)

在一些摆弄之后,我找到了解决自己问题的方法:

设置权重似乎能够影响JPanel使用GridBagLayout的组件的对齐方式。但是,它对JPanelJScrollPane的对齐没有影响。

我找到了一个相当简单的解决方案,即JPanel直接放在JScrollPane内,就像我之前的代码一样:

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

...而是将“外部”JPanel置于JScrollPane内,并将其设置为使用FlowLayout。然后,当我想要切换面板时,我将旧的移除并将面板放在“外部”面板中。

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

这种方法运作得相当好,因为这意味着我只需要在一个类中进行更改,而不是在我所拥有的许多面板中进行更改。