Как добавить компоненты в JFrame, когда он станет видимым, без изменения его размера? - PullRequest
1 голос
/ 01 июля 2011

У меня есть программа, в которой у меня есть JFrame с JButton. Когда пользователь нажимает JButton, все Components из JFrame удаляются, и к нему добавляется JPanel с красным фоном.

Когда я нажимаю JButton, этот красный JPanel не становится видимым, пока я не изменю размер JFrame (я использую Windows 7). Есть ли способ достичь того, что я хочу, без необходимости вручную изменять размер JFrame?

Вот часть кода, который я использую:

public class Demo implements ActionListener{
    public static void main(String args[]){
           ...............
        button.addActionListener(this); //'button' is an object of Jbutton class.
        frame.setVisible(true); //'frame' is an object of JFrame class.
        ............
    }

    public void actionPerformed(ActionEvent ae){
        frame.removeAllComponents();
        frame.add(panel1); //panel1 is an object of Jpanel class with red  background.

        /* Here is where my problem lies.
           panel1 is not visible to me unless I manually resize the JFrame. */
    }
}

Ответы [ 3 ]

6 голосов
/ 01 июля 2011

Для удаления (а затем, например, добавления новых JComponents) JComponents из JPanel или из контейнеров верхнего уровня вам нужно вызвать, только один рази в конце действия:

revalidate();
repaint();

И если вы только измените размер или измените JComponents:

validate();
repaint();
4 голосов
/ 01 июля 2011

Для меня это было немного странно.Как оказалось, вызов remove(Component comp), добавление нового JPanel, а затем вызов pack() работал для меня.

public class Demo{

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI(){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel();
        final JButton button = new JButton("Press Me");
        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                frame.remove(panel);

                final JPanel redPanel = new JPanel(){

                    @Override
                    public Dimension getPreferredSize(){
                        return new Dimension(200, 200);
                    }

                    @Override
                    protected void paintComponent(Graphics g){
                        Graphics g2 = g.create();

                        g2.setColor(Color.RED);
                        g2.fillRect(0, 0, getWidth(), getHeight());

                        g2.dispose();
                    }
                };

                frame.add(redPanel);
                frame.pack();
            }
        });

        panel.add(button);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Перед нажатием кнопки

enter image description here

После нажатия кнопки

enter image description here

ODDITIES

  1. Вызов removeAll() фактически вызвал зависание графического интерфейса.Похоже, что это событие произошло до .Это произошло даже после того, как я попытался удалить прослушиватель действий перед удалением всех компонентов.
  2. Мне не нужно было вызывать какой-либо из методов проверки или даже перерисовывать графический интерфейс.
0 голосов
/ 01 июля 2011

Вы должны принудительно перерисовать () в кадре, чтобы рамка перекрасилась сама.

...