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

bgu*_*uiz 4 java alignment jpanel jscrollpane gridbaglayout

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

mViewport.setViewportView(currentPanel);
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!


编辑

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

Ash*_*Ash 8

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

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


bgu*_*uiz 6

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

设置权值似乎是能够内的影响的部件的对准JPanel的量,GridBagLayout而使用.但是,它对JPanel内部的对齐没有影响JScrollPane.

我发现了一个相当简单的解决方案,就是不要把它JPanel直接放在内部JScrollPane,就像我之前使用的代码一样:

if (currentPanel != mCurrentPanel)
{
    mViewport.setViewportView(currentPanel);
}
Run Code Online (Sandbox Code Playgroud)

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

if (currentPanel != mCurrentPanel)
{
    if (mCurrentPanel != null)
    {
        mOuterPanel.remove(mCurrentPanel);
    }
    mCurrentPanel = currentPanel;
    mOuterPanel.add(mCurrentPanel);
}
Run Code Online (Sandbox Code Playgroud)

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