Перестановка панелей в раму - PullRequest
1 голос
/ 28 декабря 2010

Итак, у меня есть рамка и 2 панели, изначально панель A отображается в рамке. Я настроил его, поэтому, когда на панели нажимают кнопку, он делает обратный вызов во фрейм и запускает этот бит кода. («всплеск» - это панель, которая первоначально отображается, а «игра» - это панель, которую я хочу показать после нажатия кнопки)

public void startGame()
{
    System.out.println("starting game");
    remove(splash);

    gameThread = new Thread(game, "game thread");
    gameThread.start();
    add(game);

    /*
    this.setSize(0,0);
    this.setSize(450, 450);
    */
}

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

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

Ответы [ 4 ]

1 голос
/ 28 декабря 2010

Контейнер, содержащий панели, должен быть признан недействительным, проверен и перекрашен (все по EDT).Например, если рамка является держателем, то

frame.invalidate();
frame.validate();
frame.repaint();

Это, конечно, после добавления целевой панели.

1 голос
/ 28 декабря 2010

Вы должны использовать CardLayout для такого рода вещей вместо удаления и добавления панелей.

0 голосов
/ 28 декабря 2010

Как указал Майкл, CardLayout - это хороший способ.

Вам нужна конкретная функциональность Container.validate () .Он «заставит контейнер снова разложить свои подкомпоненты. Он должен вызываться при изменении подкомпонентов этого контейнера ... после того, как контейнер был отображен».

0 голосов
/ 28 декабря 2010

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

this.setVisible(true);

Это может сработать

...