2011-12-24 2 views
3

Я должен просмотров:Невозможно добавить JPanel в JFrame на лету

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

Итак, у меня есть выпадающий в Класс MainWindowView. И я создаю ActionListener и привязываю его к этому combobox. 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(), но показано, когда я использую ниже код?

ответ

5

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

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

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

+0

это хорошо работает! Спасибо! Мне нужно быть более внимательным к документам :) – dizpers

Смежные вопросы