我有一个简单的扩展JSplitPane,可以在需要它们的不同时间设置不同的面板。具体来说,我将其分为上下两部分,并经常调换底部。每次执行此操作时,我都会将滑块位置重置为所需的位置,但是有时它会跳到并重新定位到屏幕顶部(并非总是如此)。

这是我的代码:

public class MainPanel extends JSplitPane{

    public Screen screen;

    public int height;

    public ControlPanel curPanel;

    public MainPanel(Screen screen, int height){
        super(JSplitPane.VERTICAL_SPLIT);

        this.screen = screen;
        this.height = height;

        setDividerSize(2);
        setEnabled(false);

        setTopComponent(screen);

        setToInitControls();
    }

    public void setToInitControls(){
        InitControls initCtrls = new InitControls(this);
        setBottomComponent(initCtrls);
        curPanel = initCtrls;
        setDividerLocation(height / 4 * 3);
    }

    public void setToConfigControls(){
        ConfigControls configCtrls = new ConfigControls(this);
        setBottomComponent(configCtrls);
        curPanel = configCtrls;
        setDividerLocation(height / 4 * 3);
    }

    public void setToWaitControls(){
        WaitControls waitCtrls = new WaitControls(this);
        setBottomComponent(null);
        setBottomComponent(waitCtrls);
        curPanel = waitCtrls;
        setDividerLocation(height / 4 * 3);
    }

    //and so on (I have more methods like these further down)

    //OVERRIDES: I figured overriding these might help. It didn't.
    @Override
    public int getMinimumDividerLocation(){
        return (height / 4 * 3);
    }
    @Override
    public int getMaximumDividerLocation(){
        return (height / 4 * 3);
    }
}


基本上,我使用“ setTo ... Controls()”方法交换底部面板。有没有一种方法可以告诉滑块将其放置在我放置的位置上而与面板的首选尺寸无关,或者如果不这样,如何使面板知道自己要适应的形状?感谢您的任何/所有建议!

编辑:我应该注意,这些面板不使用布局。它们是自定义面板,我在上面使用鼠标/键盘侦听器,并使用自己的图形在其上绘画。

最佳答案

由于上面的链接,我找到了解决方案。实际上很简单。而不是使用

setDividerLocation(height / 4 * 3);


每次添加组件时,我都将其替换为:

setResizeWeight(0.66);


曾经在构造函数中这样做过,它再也没有打扰过我。 0.66是与h / 4 * 3等效的十进制位置(我只是反复试验)。

07-25 21:14