2011-08-05 64 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” –