27

在 Swing 中,使 JSplitPane 拆分两个 jpanel 的最佳方法是每个 50% 的大小。

看起来如果我没有在面板上设置首选尺寸,它总是使第一个面板几乎不可见(2%)和第二个面板(98%)

提前致谢

4

4 回答 4

29

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

另外,请注意:在可见setDividerLocation(double)之前调用将无法正常工作,因为空间计算是基于的当前大小。相反,您需要涉及一个讨厌的 hack,例如覆盖包含以下内容的 's paint 方法:JSplitPaneComponentJPanelJSplitPane

private boolean painted;

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

    if (!painted) {
        painted = true;
        splitPane.setDividerLocation(0.25);
    }
}
于 2010-02-22T15:45:31.070 回答
28

采用

setResizeWeight(.5d);

[...] 值 0 是默认值,表示右/下组件获得所有额外空间(左/上组件行为固定),其中值 1 指定左/上组件获得所有额外空间空间(右/底部组件固定)。[...]

于 2010-02-22T14:35:40.597 回答
4

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

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

这应该会导致第一次设置父容器大小时分隔线居中。

于 2013-09-30T16:56:56.717 回答
0

这里的解决方案没有考虑用户移动分隔线的情况(即可变分隔线位置)。此处提供了考虑到这一点的完整示例:

如果用户移动了分隔线的位置,如何让 JSplitPane 保持相同的比例位置

于 2016-03-18T12:10:24.390 回答