0

我只能看到最後添加的JPanel。以前的那些似乎被最後一個取代。爲什麼是這樣?這是我的代碼。提前致謝。只顯示Event-Dispatch線程中最後添加的JPanel到JFrame

... 
class GUIController { 



    BaseFrame bf = new BaseFrame(); //is a JFrame 




    public void showFrame(final String frameName, final JPanel... panels){ 

     EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        try { 
          Class c; 
          Constructor ctr; 
          c = Class.forName("com.mytunes.client.views.frames." + frameName + "Frame"); 

          ctr = c.getConstructor(); 

          bf.removeAll(); 

          bf = (BaseFrame) ctr.newInstance(); // no issue with getting the JFrame dynamically created! 


          for(JPanel panel:panels){ 

           switch(i){ 
            case 1: bf.getContentPane().add(panel,BorderLayout.PAGE_START); 

             break; 

             case 2: 
             bf.getContentPane().add(panel,BorderLayout.CENTER); 
             break; 

             case 3: 
             bf.getContentPane().add(panel,BorderLayout.PAGE_END); 
             break; 

           } 

          } 
          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); 
         } 
      } 

     }); 



    } 


    public void showEnterCard(String frame){ 

     JPanel p1 = new JPanel(); 
     JPanel p2 = new JPanel(); 
     JPanel p3 = new JPanel(); 

     showFrame(frame, p1,p2, p3); 
    } 

} 

class Main{ 
    public static void main(String args[]){ 
     GUIController c = new GUIController(); 

     c.showEnterCard("FirstFrame"); 
    } 
} 

編輯:(解決方案)

循環改變如下:

for(int i = 1; i <= panels.length; i++){ 
    switch(i){ 
     case 1: 
       bf.getContentPane().add(panels[0],BorderLayout.PAGE_START); 
     break; 
     ... 
    } 
} 

回答

2

你永遠不會改變i,它始終是一個,所以case 1:在開關始終是真實的,而JPanel總是添加到同一個地方。

+0

對不起。 int i = 1;只是一個錯字。它沒有效果。我使用了增強型for循環。 – coder9

+0

@ coder9你的交換機裏有什麼'i'然後 – jgon

+0

我的不好。再次。我想到了。如上所述改變循環並修復它。 +1作爲快速回復。 :) – coder9