Как я могу изменить JPanel внутри JFrame на лету? - PullRequest
39 голосов
/ 20 октября 2008

Проще говоря, есть простое Java-приложение, которое состоит из JFrame с некоторыми компонентами. Одним из компонентов является JPanel, который должен быть заменен другим JPanel при действии пользователя.

Итак, как правильно делать такие вещи? Я пробовал

panel = new CustomJPanelWithComponentsOnIt();
parentFrameJPanelBelongsTo.pack();

но это не сработает. Что бы вы предложили?

Ответы [ 14 ]

0 голосов
/ 05 августа 2015

Вы можете использовать метод замены макета:

layout.replace(existingComponent, newComponent)

существующие и новые компоненты также могут быть JPanels.

0 голосов
/ 09 августа 2012

Просто вызовите метод pack () после установки ContentPane, (java 1.7, возможно, старше) следующим образом:

JFrame frame = new JFrame();  
JPanel panel1 = new JPanel(); 
JPanel panel2 = new JPanel(); 
....
frame.setContentPane(panel1);
frame.pack();
...

frame.setContentPane(panel2);
frame.pack();
...
0 голосов
/ 26 февраля 2012
class Frame1 extends javax.swing.JFrame {

    remove(previouspanel); //or getContentPane().removeAll();

    add(newpanel); //or setContentPane(newpanel);

    invalidate(); validate(); // or ((JComponent) getContentPane()).revalidate();

    repaint(); //DO NOT FORGET REPAINT

}

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

0 голосов
/ 20 октября 2008

Я предлагаю вам добавить обе панели при создании кадра, а затем изменить видимую панель, вызвав setVisible (true / false) для обоих. При вызове setVisible родитель будет уведомлен и попросит перекрасить себя.

...