Не могу добавить JPanel в JFrame на лету - PullRequest
3 голосов
/ 24 декабря 2011

Мне нужно просмотреть:

  1. MainWindowView (расширяет JFrame)
  2. ScanOptimisationView (расширяет JPanel)

Итак, у меня есть комбинированный список в MainWindowViewучебный класс.И я создаю ActionListener и привязываю его к этому списку.Метод actionPerfomed () этого ActionListener пытается добавить панель ScanOptimisationView в рамку главного окна.Вот код:

package ru.belaventcev.view;

import java.awt.Container;

public class MainWindowView extends JFrame{
    private int frmHeight = 525;
    private int frmWidth  = 650;

    public Container frmContainer;

    public static JButton btnCalc;

    public static JComboBox cbMethods;

    public MainWindowView(){
        setPreferredSize(new Dimension(frmWidth, frmHeight));
        setSize(frmWidth, frmHeight);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        frmContainer = getContentPane();
        frmContainer.setLayout(new MigLayout("", "[grow,center]", "[::30px,grow,center][grow,center][::500px,grow,center][::25px,grow,center]"));
        cbMethods = new JComboBox();
        cbMethods.setModel(new DefaultComboBoxModel(new JPanel[] {new ScanOptimisationView()}));
        cbMethods.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JPanel temp = (JPanel) cbMethods.getSelectedItem();
                frmContainer.add(temp, "cell 0 1,span");
            }
        });

        /*
         * If I uncomment this, panel is shown!
        JPanel temp = (JPanel) cbMethods.getSelectedItem();
        frmContainer.add(temp, "cell 0 1");
        */

        frmContainer.add(cbMethods, "cell 0 0,growx");



        btnCalc = new JButton("Расчитать");
        frmContainer.add(btnCalc, "cell 0 3,alignx right");

    }
}

Не могли бы вы помочь мне понять - почему панель не отображается с кодом в actionPerformed (), а отображается, когда я использую приведенный ниже код?

1 Ответ

5 голосов
/ 24 декабря 2011

В нерабочем случае, после того, как ваш actionListener вызывает frmContainer.add(), вам нужно позвонить frmContainer.validate().Из Javadocs для Container.add ():

"Если компонент был добавлен в контейнер , который был отображен , в этом контейнере должна быть вызвана validate для отображения нового компонента."

Когда вы отвечаете на щелчок, ваш контейнер, очевидно, уже был отображен.Когда вы добавляете JPanel в конструктор, ваш JFrame еще не отображался.

...