在我的GUI应用程序中,我有几个JPanel,它们在我的程序运行期间的各个点被实例化,并且某些操作将导致其中一个显示在滚动窗格中:
mViewport.setViewportView(currentPanel);
麻烦的是,我的面板是使用Grid Bag Layouts完成的,其行为是将其自身置于其内部的JScrollPane中。这使得GUI看起来很奇怪。
任何人都知道强制网格包布局面板左上角对齐的方法吗?
谢谢!
修改
请注意,我在这里询问整个面板在其滚动窗格中的对齐方式,而不是面板内的组件。
答案 0 :(得分:8)
您需要在面板内的一个或多个组件上设置权重(在GridBagConstraints
中)。这具有“推动”组件以占用更多可用空间的效果(没有重量,组件将只占用他们需要的东西,并且面板将在可用空间内居中)。
如果要对齐滚动窗格左上角的组件,请将底部组件的y权重设置为1.0,并将最右侧组件的x权重设置为1.0。
答案 1 :(得分:6)
在一些摆弄之后,我找到了解决自己问题的方法:
设置权重似乎能够影响JPanel
使用GridBagLayout
的组件的对齐方式。但是,它对JPanel
中JScrollPane
的对齐没有影响。
我找到了一个相当简单的解决方案,即不将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);
}
这种方法运作得相当好,因为这意味着我只需要在一个类中进行更改,而不是在我所拥有的许多面板中进行更改。