2011-07-07 9 views
3

JPanelをJComboBoxに「結びつける」かなり短いクラスを作成しようとしています。 )私は(再描画を無効にする必要がありますと仮定していますJPanelがJComboBoxで選択したときに更新されない

private DisplayPanel currentDisplay; //a displaypanel is simply an extended JPanel with an id field, and an overriden .equals() method 
private JComboBox selector; 
private List<DisplayPanel> displays; 

public SelectionPanel(DisplayPanel panel){ 
    displays = new ArrayList<DisplayPanel>(); 
    selector = new JComboBox(new String[]{panel.id}); 
    currentDisplay = panel; 
    selector.addActionListener(this); 
    this.add(selector); 
    this.add(currentDisplay); 
    this.displays.add(panel); 
} 

public void addNewSelection(DisplayPanel panel){ 
    displays.add(panel); 
    selector.addItem(panel.id); 
} 


@Override 
public void actionPerformed(ActionEvent e) { 
    JComboBox source = (JComboBox) e.getSource(); 
    String id = (String) source.getSelectedItem(); 
    for(DisplayPanel display: displays) 
     if(id.equals(display.id)) 
       currentDisplay = display; 
    this.validate();   
} 

:私は、私がダウンしてロジックを持っていると思うが、私はJComboBoxのを使用して新しいものを選択すると、何も起こりません...ここにある(多かれ少なかれ)私のコードどういうわけか、私は本当にそれを行うための最善の方法はわかりません。ここで

+0

私は100%確実ではありませんが、毎回そのパネルを完全に置き換えるべきではないと思います。 (私は100%確信しているわけではない) – jjnguy

答えて

4

(多かれ少なかれ)私のコードです:

私たちは、コードが使用されている方法の文脈を知らないので、私たちを助けていません。質問をするときは、より良い助けのためにSSCCEを投稿してください。

currentDisplay = display;

このコード行は正しく表示されません。変数の値を変更するだけです。このパネルはGUIに追加されません。あなたの基本的なコードは次のようになります。

panel.remove(theOldPanel); 
panel.add(theNewPanel); 
panel.revalidate(); 
panel.repaint(); 

しかし、これはCardLayoutがあなたのためにまったく同じものですので、適切な解決策はaardvarkkの提案に従うことです。あなたはGUIにcurrentDisplayを追加すると

4

、あなたはGUIにcurrentDisplayに変数を追加するのではなく、currentDisplay変数が参照するオブジェクトしていません。後でcurrentDisplay変数がどのコンポーネントを参照するかを変更すると、元のオブジェクトがまだ保持されているため、GUIによって表示されるコンポーネントにはの影響は全くありません。

私はCardLayout(1+からaardvarkk)を使用することをaardvarkkが推奨しています。これを行うと、スムーズに動作することがわかります(そしてAardvarkkの答えはと答えてください)。

関連する問題