2011-02-08 63 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