2011-01-14 2 views
3

Я создал подкласс JFrame, содержащий 9 JPanels, используя GridLayout (3x3). Я пытаюсь разработать метод, который случайным образом перестраивает JPanels внутри JFrame. Вот то, что я до сих пор:Переупорядочение 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 в макете? Заранее спасибо!

ответ

3

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

((JPanel)getContentPane()).revalidate(); 
getContentPane().repaint(); 
+0

Brilliant! Спасибо! – AndreiM

+0

Добро пожаловать, но это точно не блеск, но скорее опыт ... Я был сожжен этим раз или два в прошлом, поэтому я никогда не забуду это. :) –

0

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

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); 
    } 
+0

не повезло :(. Поведение с ArrayList то же самое. – AndreiM

+0

Затем попробуйте установить новый GridLayout перед добавлением компонентов. –

Смежные вопросы