Добавление дополнительных панелей в JFrame, который находится в потоке EventDispath, извне что? - PullRequest
0 голосов
/ 07 октября 2011

Я создаю новый фрейм в потоке 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");
    }
}

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

не создавайте GUI таким образом, если вы хотите переключаться только между двумя JPanels внутри JFrame , тогда у вас есть два очень простых варианта выбора

1) JFrameимеет по умолчанию BorderLayout , и если вы поставите туда JPanel (add.myPanel;), то этот JPanel будет помещен в область CENTER и займет целое JFrame, и только в BorderLayoutодин JComponent может быть помещен в конкретную область, тогда вы будете звонить только (без удаления, любая причина для этого)

myFatherPanel.add(myPanel, BorderLayout.PAGE_START);
revalidate();
repaint();

2), и лучше всего будет заложить ваш GUI с помощью CardLayout , тогда вы можете забыть обо всех проблемах с вашим графическим интерфейсом

3) более безопасным было бы разместить (к JFrame) FatherPanel (который никогда не был удален) и удалить JComponents из этого FatherPanel, потому что если вы звоните на JFrame#removeAll(), то вы удалили RootPane, и из вашего JFrame остается там только Borders, как вы описали

0 голосов
/ 07 октября 2011

Что еще? Также с:

SwingUtilities.invokeLater(new Runnable() {
                public void run() { ... }
}
...