2012-11-19 29 views
3

我需要在兩個(或更多)組合框之間共享數據,但我想獨立選擇元素。例如,如果我在第一個comboBox中選擇Object1,我的第二個ComboBox也會選擇Object1,因爲它們具有相同的模型(DefaultComboBoxModel,此模型也管理所選對象)。但我不想要這種行爲。我想獨立地在我的組合框中選擇對象。當我在第一個comboBox中選擇對象時,我的第二個comboBox不應該改變。兩個組合框之間的共享數據

在這一刻我想兩個模型的超級名模。超級名模將發送事件給子模型,他們將更新組合框數據,但不是狀態。但我認爲這不是最好的方法。

是否有更多有趣的和簡單的aproaches?

下面是短代碼,明白我的意思:

package hello; 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JComboBox; 
public class Comboboxes extends JFrame 
{ 
private JPanel contentPane; 
public static void main(String[] args) 
{ 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      try 
      { 
       Comboboxes frame = new Comboboxes(); 
       frame.setVisible(true); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public Comboboxes() 
{ 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    JComboBox one = new JComboBox(); 
    one.setBounds(10, 11, 414, 26); 
    contentPane.add(one); 

    JComboBox two = new JComboBox(); 
    two.setBounds(10, 52, 414, 26); 
    contentPane.add(two); 

    DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>(); 
    model.addElement("Item 1"); 
    model.addElement("Item 2"); 
    model.addElement("Item 3"); 

    one.setModel(model); 
    two.setModel(model); 
} 
} 
+1

難道你不能簡單地創建相同的ComboBoxModel兩個不同的實例 - >相同的值+不同的選擇? –

+0

我可以,但數據可能會更改,我將不得不更改兩個實例。 – Moses

+0

不相關:不要做任何手動調整/定位組件,這是合適的LayoutManager – kleopatra

回答

4

撰寫裝飾爲您ComboBoxModel。裝飾者應該管理selectedItem財產,而其他一切都由代表管理。

你會再有1個原始模型,並將其放置不同的裝飾在組合框:

DefaultComboBoxModel original = ...; 

DecoratedModel firstModel = new DecoratedModel(original); 
JComboBox firstCombo = new JComboBox(firstModel); 

DecoratedModel secondModel = new DecoratedModel(original); 
JComboBox secondCombo = new JComboBox(secondModel); 

更改然後可以在original模型執行的數據,這將同時在所有組合框

調整數據

注意:確保附加到裝飾器的偵聽器接收裝飾模型作爲源的事件,而不是委託模型。寫一個裝飾

編輯

另一種是有一個基本數據結構是不是ComboBoxModel,創造ComboBoxModel實現它使用的數據結構時,這是一個常見的錯誤。然後,您可以創建不同的組合框模型實例,它們都共享相同的數據結構。

+0

+1的裝飾任務 - 雖然我花了一些時間來理解_caveat_的含義(可能是語言問題,我會稱之爲裝飾模型的正確實現:-) – kleopatra

+1

@kleopatra的確是一個更好的名字。但是我看到了足夠的裝飾器實現違反了這個。因此我明確提到它。我把它調整到一個註釋 – Robin

+0

這似乎是一個很好的方法,但我現在不真的如果我能實現這一點。但我會嘗試。謝謝。 – Moses