2011-07-07 69 views
3

我試圖編寫一個很短的類,將JPanel「綁定」到JComboBox。我覺得我有邏輯下來,但是當我選擇使用的JComboBox新的東西什麼也沒有發生......這是(或多或少)我的代碼:Janel不會刷新與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();   
} 

我假設我需要重寫重繪()功能,但我真的不確定最好的方式來做到這一點。

+0

我不是100%確定,但我認爲你不應該每次都完全取代該面板。 (雖然我不是100%確定) – jjnguy

回答

4

這裏是(或多或少)我的代碼:

這不利於我們,因爲我們不知道的代碼是如何使用的上下文。在提問時發帖SSCCE以獲得更好的幫助。

currentDisplay = display;

該行代碼看起來不正確。它所做的只是改變一個變量的值。它不會將面板添加到GUI。你基本的代碼如下:

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

然而,這正是一個CardLayout爲你做的,所以妥善解決是遵循aardvarkk的建議。

4

當您添加currentDisplay到GUI,你不添加currentDisplay 變量到GUI,而是對象的currentDisplay變量是指。因此,稍後當您更改currentDisplay變量引用的組件時,應該有道理的是,由於該組件仍保留原始對象,因此它對GUI所顯示的組件沒有任何影響。

我第二次由aardvarkk推薦你使用CardLayout(1+ toardardark)。如果你這樣做,你會發現它會工作順利(然後你應該接受Aardvarkk的答案,答案)。