расположение мешка сетки java: избегая выравнивания центра - PullRequest
4 голосов
/ 20 января 2010

В моем приложении с графическим интерфейсом у меня есть несколько JPanels, которые создаются в различных точках во время работы моей программы, и некоторые действия приведут к отображению одного из них в области прокрутки:

mViewport.setViewportView(currentPanel);

Беда в том, что мои панели выполнены с использованием компоновок Grid Bag, и поведение заключается в том, чтобы центрировать себя внутри JScrollPane, внутри которого он находится. Это делает графический интерфейс странным.

Кто-нибудь знает, как заставить панель макета мешка сетки выравнивать верхний левый угол?

Спасибо!


EDIT

Обратите внимание, что здесь я спрашиваю о выравнивании всей панели внутри панели прокрутки, а не о компонентах внутри панели.

Ответы [ 2 ]

8 голосов
/ 20 января 2010

Вам нужно будет установить веса (в GridBagConstraints) для одного или нескольких компонентов внутри вашей панели. Это приводит к тому, что компоненты «выталкивают», чтобы занять больше доступного пространства (без весов компоненты будут занимать только то, что им нужно, и панель будет центрирована в доступном пространстве).

Если вы хотите выровнять компоненты в верхнем левом углу панели прокрутки, установите для y веса нижнего компонента значение 1.0, а для веса x самого правого компонента - значение 1.0.

6 голосов
/ 21 января 2010

Я нашел решение своего собственного вопроса после некоторой путаницы:

Установка весов, по-видимому, может влиять на выравнивание компонентов в JPanel, для которого использовался GridBagLayout.Однако это не повлияло на выравнивание JPanel в пределах JScrollPane.

. Я нашел довольно простое решение, которое состоит в том, чтобы не ставить JPanel прямо внутри JScrollPane, как я делал с моим предыдущим кодом:

if (currentPanel != mCurrentPanel)
{
    mViewport.setViewportView(currentPanel);
}

... но вместо этого поместил «внешний» JPanel внутри JScrollPane и установил, чтоиспользовать FlowLayout.Затем, когда я хочу переключить панели, я удаляю старую и помещаю панель в «внешнюю» панель.

if (currentPanel != mCurrentPanel)
{
    if (mCurrentPanel != null)
    {
        mOuterPanel.remove(mCurrentPanel);
    }
    mCurrentPanel = currentPanel;
    mOuterPanel.add(mCurrentPanel);
}

Этот подход работал довольно хорошо, потому что это означало, что я должен был произвести изменения только в одном классевместо каждой из множества панелей, которые у меня были.

...