JFrame удаление JPanels и добавление новой JPanel
В настоящее время у меня есть SwingWorker, который отправляет HTTP-запрос, и я переопределяю метод SwingWorker done() для изменения содержимого в JFrame. Я хочу в основном удалить все и добавить новую панель members на JFrame в зависимости от значений, возвращаемых с сервера.
Теперь проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю следующие методы ниже на JFrame, он ничего не удаляет из JFrame и не изменяет его содержимое, содержащееся в JFrame. Рамка.
//TODO: Investigate why JFrame content pane won't repaint.
f.removeAll();
//Pass the frame f reference only into MainDisplay, it doesn't actually do anything apart from allowing a class to add a JMenuBar on the JFrame.
f.add(new MainDisplay(f));
f.getContentPane().invalidate();
f.getContentPane().validate();
f.getContentPane().repaint();
Текущее исправление, которое у меня есть, это ниже, но я бы предпочел изменить содержимое JFrame, а не загружать новый.
f.dispose();
f=new ApplicationFrame();
Я просмотрел предыдущие ответы здесь и в Google, и некоторые государства используют validate() или invalidate (), вызывая repaint () для перерисовки JFrame.
Любые предложения/помощь будут высоко оценены.
Edit: я думаю, что буду отлаживать больше, так как должно быть что-то еще идет не так.
4 ответа:
Например
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MyFrame extends JFrame { private static final long serialVersionUID = 1L; public MyFrame() { final JPanel parentPanel = new JPanel(); parentPanel.setLayout(new BorderLayout(10, 10)); final JPanel childPanel1 = new JPanel(); childPanel1.setBackground(Color.red); childPanel1.setPreferredSize(new Dimension(300, 40)); final JPanel childPanel2 = new JPanel(); childPanel2.setBackground(Color.blue); childPanel2.setPreferredSize(new Dimension(800, 600)); JButton myButton = new JButton("Add Component "); myButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { parentPanel.remove(childPanel1); parentPanel.add(childPanel2, BorderLayout.CENTER); parentPanel.revalidate(); parentPanel.repaint(); pack(); } }); setTitle("My Empty Frame"); setLocation(10, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); parentPanel.add(childPanel1, BorderLayout.CENTER); parentPanel.add(myButton, BorderLayout.SOUTH); add(parentPanel); pack(); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { MyFrame myFrame = new MyFrame(); } }); } }
Вы пытаетесь
repaint()/validate()
ContentPane. Вы пробовали сделать то же самое наJFrame
? Вы также можете попробоватьJFrame#pack()
.