JSplitPane精确分裂50%

use*_*731 25 java swing jcomponent

在Swing中,最好的方法是让JSplitPane分割两个jpanel,每个jpanel的大小为50%.

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

提前致谢

Ada*_*ski 29

您应该使用setDividerLocation(double proportionalLocation)来确定初始空间分配JSplitPane,然后调用setResizeWeight(double)具有相同值,以确保窗格中的比例调整.

此外,请注意:setDividerLocation(double)JSplitPane可见之前调用将无法正常工作,因为空间计算基于Component当前大小.相反,你需要涉及一个讨厌的黑客,例如重写JPanel包含以下内容的paint方法JSplitPane:

private boolean painted;

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

    if (!painted) {
        painted = true;
        splitPane.setDividerLocation(0.25);
    }
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ang 27

使用

setResizeWeight(.5d);

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

  • setResizeWeight(double)仅用于"在拆分窗格的大小更改时分配额外空间".它不确定初始空间分布. (6认同)

Wil*_*ton 5

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

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

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