2011-08-05 76 views
2

我有2個面板。第一個面板有一個組合框。取決於所選組合框中項目的值,它下方的面板必須更改。在組合框的動作偵聽器中,當我嘗試更改面板時,它不會更改。爲什麼是這樣?無法動態更改面板

cb1.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String s = (String) cb1.getSelectedItem(); 
      if (s.equals("Invoice")) { 
       panel3Customizera(); 
       g.gridy = 2; 
       remove(panel3); 
       add(panel3, g); 
      } else { 
       panel3Customizerb(); 
       g.gridy = 2; 
       add(panel3, g); 
      } 

     } 
    }); 

將panel3customizer添加到panel3.panel 3中的元素添加到jframe中。可以找到整個代碼的鏈接here

+2

提供一個[SSCCE](http://sscce.org/),而不是提供您的源代碼的鏈接,我們隨後需要下載該鏈接。 – mre

回答

5

您需要在保存panel3對象的容器上調用revalidate和repaint,並在添加或刪除組件後在此處使用GridBagLayout。請注意,重新驗證僅適用於從JComponent派生的對象,如JPanel。

編輯1
如果直接添加到JFrame,那麼你實際上是增加了它的contentPane這通常是一個JPanel。所以,在做什麼,我建議將看起來像這樣的例子:

cb1.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     JPanel contentPane = (JPanel) getContentPane(); 
     String s = (String) cb1.getSelectedItem(); 
     if (s.equals("Invoice")) { 
      panel3Customizera(); 
      g.gridy = 2; 
      remove(panel3); 
      contentPane.add(panel3, g); 
     } else { 
      panel3Customizerb(); 
      g.gridy = 2; 
      contentPane.add(panel3, g); 
     } 
     contentPane.revalidate(); 
     contentPane.repaint(); 
    } 
    }); 

但話雖如此,我已經把一個大的插頭插入MRE的有關使用CardLayout,而不是交換的意見建議。

+0

嗨,我試着添加。但並沒有改變。你能告訴我在什麼地方我應該加上這些。 panel3在一個框架中。謝謝 –

+0

@Kaushik:請參閱上面的「編輯1」 –