Я создаю новый фрейм в потоке EventDispatch и хочу добавить новые панели к нему позже.Но все, что я получаю, это пустая рамка с 0 высотой.Но панели, добавленные изнутри внутреннего класса, отображаются.Как добавить с помощью showFirstFrame ()?Мне пришлось следовать такому подходу после получения этой проблемы: Все кадры Swing "замораживаются" при вызове wait () в Java
Я имел в виду этот урок: http://leepoint.net/JavaBasics/gui/gui-commentary/guicom-main-thread.html
Заранее спасибо.
public class GUIController {
JFrame bf;
JFrame tempFrame;
public JFrame showFrame(){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
Class c;
Constructor ctr;
c = Class.forName("SomeJFrame");
ctr = c.getConstructor();
GUIController.this.bf.removeAll();
GUIController.this.bf = (BaseFrame) ctr.newInstance();
GUIController.this.bf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
GUIController.this.bf.pack();
GUIController.this.bf.setVisible(true);
} catch (InstantiationException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchMethodException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
return GUIController.this.bf;
}
public void showFirstFrame(){
tempFrame = showFrame();
tempFrame .getContentPane().add(headerPanel, BorderLayout.PAGE_START);
tempFrame .getContentPane().add(new EnterSomePanel(), BorderLayout.CENTER);
tempFrame .getContentPane().add(footerPanel, BorderLayout.PAGE_END);
tempFrame .setVisible(true);
}
}
РЕДАКТИРОВАТЬ:
...
class GUIController {
HeaderPanel headerPanel = new HeaderPanel(); // extends JPanel
FooterPanel footerPanel = new FooterPanel();
BaseFrame bf = new BaseFrame(); // extends JFrame
public BaseFrame showFrame(String frameName){
try {
Class c;
Constructor ctr;
c = Class.forName("some.dynamically.loaded.JFrame" + frameName);
ctr = c.getConstructor();
bf = (BaseFrame) ctr.newInstance();
bf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
bf.pack();
bf.setVisible(true);
} catch (InstantiationException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchMethodException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(GUIController.class.getName()).log(Level.SEVERE, null, ex);
}
return bf;
}
public void showFirstFrame(final String frame){ //some controller will pass a frame name to this
bf = showFrame(frame);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
bf.getContentPane().add(headerPanel, BorderLayout.PAGE_START);
bf.invalidate();
bf.validate();
System.out.println("test");
}
});
}
}
class Main{
public static void main(String args[]){
GUIController c = new GUIController();
c.showFirstFrame("FirstFrame");
}
}