2011-02-08 65 views
8

在Java Swing中,JListJComboBox在數據方面同步的最佳方式是什麼,即在任何給定的時間點都有相同的項目列表?基本上,如果我將項目添加到(或從中刪除項目),另一個應該自動反映更改。同步JList和JComboBox?

我試着做以下,但它似乎並沒有工作:

JList list = new JList(); 
JComboBox comboBox = new JComboBox(); 
DefaultListModel listModel = new DefaultListModel(); 
// add items to listModel... 
list.setModel(listModel); 
comboBox.setModel(new DefaultComboBoxModel(listModel.toArray())); 

回答

10

您的機型 - 爲的ListModel列表和ComboBoxModel中的組合框 - 需要同步。

在一般情況下,這意味着要編寫一個模型的特殊實現,但在你的情況下你有運氣:DefaultComboBoxModel實際上實現了ListModel,所以你可以簡單地爲你的組件使用相同的模型對象。

JList list = new JList(); 
JComboBox comboBox = new JComboBox(); 
DefaultComboBoxModel listModel = new DefaultComboBoxModel(); 
// add items to listModel... 
list.setModel(listModel); 
comboBox.setModel(listModel); 
+0

我不敢相信即使淘汰了API,我也沒有想到。它工作完美。非常感謝你的幫助! – 2011-02-09 08:51:49

5

你可以讓他們共享相同的模型,可能是因爲DefaultComboBoxModel它實現的ListModel,因此應爲兩個工作JComboBox和JList。例如:

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class ShareComboModel { 
     private static final int TIMER_DELAY = 2000; 

     public static void main(String[] args) { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        createGui(); 
       } 
      }); 
     } 

     private static void createGui() { 
      String[] data = {"Fe", "Fi", "Fo", "Fum"}; 

      final DefaultComboBoxModel model = new DefaultComboBoxModel(data); 

      JComboBox combobox = new JComboBox(model); 
      JList jlist = new JList(model); 

      new Timer(TIMER_DELAY, new ActionListener() { 
       private int count = 0; 
       public void actionPerformed(ActionEvent e) { 
        model.addElement("count: " + count); 
        count++; 
       } 
      }).start(); 

      JPanel comboPanel = new JPanel(); 
      comboPanel.add(combobox); 

      JPanel listPanel = new JPanel(); 
      listPanel.add(new JScrollPane(jlist));   

      JPanel panel = new JPanel(new GridLayout(1, 0)); 
      panel.add(comboPanel); 
      panel.add(listPanel); 
      panel.setPreferredSize(new Dimension(400, 200)); 

      JFrame frame = new JFrame("App"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.getContentPane().add(panel); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
} 
+0

問題已解決。非常感謝! – 2011-02-09 08:52:25