Переупорядочивать JPanels в области содержимого JFrame? - PullRequest
3 голосов
/ 15 января 2011

Я создал подкласс JFrame, содержащий 9 JPanels, используя GridLayout (3x3). Я пытаюсь разработать метод, который случайным образом переставляет JPanels в JFrame. Вот что у меня есть:

public void shuffle() {
    Stack<Component> panels = new Stack<Component>();
    for(Component c : this.getContentPane().getComponents())
      panels.push(c);    

    this.getContentPane().removeAll();    
    Collections.shuffle(panels);    

    while(!panels.isEmpty())
      this.getContentPane().add(panels.pop());

    this.repaint();    
}

После запуска этого метода JPanels находятся в тех же позициях в GridLayout, что и раньше! Я подтвердил, что JFrame действительно перекрашивается, мой стек перетасовывается, и что методы removeAll() и add() работают. Панель содержимого, похоже, запоминает, где были JPanels, поэтому изменение порядка вызовов add(), похоже, не работает.

Где я делаю ошибку? Кто-нибудь знает лучший способ перетасовать позиции JPanels в макете? Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 15 января 2011

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

((JPanel)getContentPane()).revalidate();
getContentPane().repaint();
0 голосов
/ 15 января 2011

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

   List<Component> panels = new ArrayList<Component>();
   for(Component c : this.getContentPane().getComponents())
        panels.add(c); 

   this.getContentPane().removeAll();    
   Collections.shuffle(panels);   

   this.getContentPane().setLayout(new GridLayout(3,3));

   for(Component c: panels){
       this.getContentPane().add(c);
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...