2011-08-05 2 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

答えて

4

JPanelのような音はCardLayoutを使用する必要があります。 How to Use CardLayoutに関するチュートリアルです。

@Hovercraft Full Of Eelsは、コンテナオブジェクトにrevalidate()repaint()を呼び出すことを推奨しています。これは、コンポーネントを再度レイアウトし、視覚的な「アーティファクト」を取り除くためです。

+0

私よりも良い答え:アップ - 投票 –

+0

これは働いた!どうもありがとう! –

5

panel3オブジェクトを保持するコンテナでrevalidateとrepaintを呼び出す必要があります。ここでは、コンポーネントの追加または削除後にGridBagLayoutが使用されます。 revalidateはJPanelなどのJComponentから派生したオブジェクトに対してのみ有効です。

編集1
あなたは、あなたが通常のJPanelでそのcontentPaneに実際に追加され、JFrameのに直接追加する場合。だから私はこのようになります示唆し何をしての例:

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

が、これを言ったが、私は意見を交換する代わりにCardLayoutを使用する方法についてMREの提案に大きなプラグを配置する必要があります。

+0

こんにちは、私はそれを追加しようとしました。それは変わらなかった。あなたはそれらを追加すべき場所を教えてください。 panel3はフレーム内にあります。ありがとう –

+0

@ Kaushik:上の "編集1"を参照してください –