Как заблокировать разделитель JSplitPane при обмене компонентами? - PullRequest
1 голос
/ 14 августа 2011

У меня есть простая расширенная 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 ()", чтобы поменять местами нижние панели. Есть ли способ сказать ползунку, чтобы он оставался на том же месте, где я его разместил, независимо от предпочтительных размеров панели, или, если нет, как заставить панели знать, в какую форму они вписываются? Спасибо за любые предложения!

РЕДАКТИРОВАТЬ: я должен отметить, что эти панели не используют макеты. Это пользовательские панели, на которых я использую мышь / клавиатуру и рисую поверх них собственную графику.

1 Ответ

0 голосов
/ 15 августа 2011

Я нашел решение, благодаря ссылкам выше. Это на самом деле довольно просто. Вместо использования

setDividerLocation(height / 4 * 3);

каждый раз, когда я добавлял компонент, я просто заменял его на:

setResizeWeight(0.66);

Сделал это однажды в конструкторе, и это никогда не беспокоило меня снова. 0,66 - это десятичная позиция, эквивалентная h / 4 * 3 (я просто пробовал и ошибался).

...