JFrame удаляет JPanels и добавляет новый JPanel - PullRequest
5 голосов
/ 23 ноября 2011

В настоящее время у меня есть SwingWorker, который отправляет HTTP-запрос, и я переопределяю метод done () SwingWorker для изменения содержимого в 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.

Любые предложения / помощь будут высоко оценены.

Редактировать: Я думаю, что я собираюсь отлаживать больше, так как должно быть что-то еще идет не так.

Ответы [ 4 ]

8 голосов
/ 23 ноября 2011

например

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();
            }
        });
    }
}
1 голос
/ 06 августа 2012

модификация вашего кода

f.setContentPane(new MainDisplay(f)); 
f.getContentPane().invalidate();
f.getContentPane().validate();
f.getContentPane().repaint();
1 голос
/ 23 ноября 2011

Вы пытаетесь repaint()/validate() ContentPane.Вы пытались сделать то же самое на JFrame?Вы также можете попробовать JFrame#pack().

0 голосов
/ 22 января 2016

Вы можете попробовать использовать Frame.pack() снова, это сработало для меня. Или попробуйте один из следующих способов:

Frame.setOpaque(false);
Frame.setEnabled(false);
Frame.setVisible(false);
Frame.removeAll();
...