JList synchronisé et JComboBox?

Dans Java Swing, quel est le meilleur moyen pour une JList et une JComboBox d’être synchronisées en termes de données, c’est-à-dire d’avoir la même liste d’éléments à un moment donné? Fondamentalement, si j’ajoute des éléments à (ou supprime des éléments de l’un), l’autre doit refléter automatiquement le changement.

J’ai essayé de faire ce qui suit, mais cela ne semble pas fonctionner:

 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())); 

Vos modèles – le ListModel pour la liste et le ComboboxModel pour la combobox – doivent être synchronisés.

Dans le cas général, cela impliquerait d’écrire une implémentation spéciale des modèles, mais dans votre cas, vous avez de la chance: DefaultComboBoxModel implémente ListModel, ce qui vous permet simplement d’utiliser le même object de modèle pour vos deux composants.

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

Vous pourriez les faire partager le même modèle, probablement un DefaultComboBoxModel, car il implémente ListModel et devrait donc fonctionner à la fois pour JComboBox et JList. Par exemple:

  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(Ssortingng[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createGui(); } }); } private static void createGui() { Ssortingng[] 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); } }