JSplitPane精确分割50%

27

在Swing中,如何最好地使用JSplitPane将两个jpanel拆分为相等的50%大小。

看起来如果我不在面板上设置首选大小,它总是会使第一个面板几乎不可见(2%),而第二个面板则占据了剩余的空间(98%)。

提前致谢。

4个回答

29

你应该使用setDividerLocation(double proportionalLocation)来确定JSplitPane初始空间分配,然后使用相同值调用setResizeWeight(double)以确保窗格按比例调整大小。

还要注意:在JSplitPane可见之前调用setDividerLocation(double) 不会正确工作,因为空间计算是基于组件当前的大小。相反,你需要使用一种不好的方法,例如重写包含JSplitPaneJPanel的paint方法:

private boolean painted;

@Override
public void paint(Graphics g) {
    super.paint(g);

    if (!painted) {
        painted = true;
        splitPane.setDividerLocation(0.25);
    }
}

+1 它运行得非常好!只有一个提示给下一个遇到这个问题的人:要注意组件的“最小尺寸”属性。如果最小尺寸大于可用空间,则 JSplitPane 的第一次绘制将正常工作,但如果您调整窗口大小,则会重新计算。在这种情况下,一个快速修复方法是:component.setMinimumSize(new Dimensions(0,0)) - José Ramón

29

使用

setResizeWeight(.5d);

[...] 默认值为0,表示右侧/底部组件会占用额外空间(左侧/顶部组件保持不变),而一个值为1则意味着左侧/顶部组件会占用全部的额外空间(右侧/底部组件保持不变)。[...]


6
setResizeWeight(double) 方法仅用于“在拆分窗格大小更改时分配额外空间”。它不确定初始空间分配。 - Adamski

5

我曾经遇到类似的问题,通过在父容器中使用组件监听器并在第一次调整大小时设置分隔位置来解决了它。首先初始化一个名为firstResize的变量,并将其添加到父容器构造函数中:

addComponentListener(new ComponentAdapter(){
    @Override
    public void componentResized(ComponentEvent e) {
        if(firstResize){
            splitPane.setDividerLocation(0.5);
            firstResize = false;
        }
    }
});

当父容器大小首次设置时,这应该使分隔线居中。


1

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