2011-02-08 20 views
8

W Java Swing, jaki jest najlepszy sposób synchronizacji danych pod względem JList i JComboBox, tj. Posiadania tej samej listy elementów w dowolnym momencie? Zasadniczo, jeśli dodaję elementy do (lub usuwam z nich), drugi powinien automatycznie odzwierciedlać zmianę.Zsynchronizowane JList i JComboBox?

Próbowałem robić następujące, ale nie wydaje się działać:

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

Odpowiedz

10

modeli - the ListModel na liście i ComboboxModel dla combobox - muszą być zsynchronizowane.

W ogólnym przypadku oznaczałoby to pisanie specjalnej implementacji modeli, ale w twoim przypadku masz szczęście: DefaultComboBoxModel w rzeczywistości implementuje ListModel, więc możesz po prostu użyć tego samego obiektu modelu dla obu komponentów.

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

Nie mogę uwierzyć, że o tym nie pomyślałem, nawet po przejrzeniu interfejsów API. Działało idealnie. Bardzo dziękuję za Twoją pomoc! –

+1

Czy chcesz synchronizować elementy, ale czy istnieje prosty sposób na synchronizację wybranego elementu? – HpTerm

+0

@HpTerm: Nie takie proste. Comboboxmodel zarządza samym wyborem, podczas gdy lista ma osobny ListSelectionModel. Możesz podklasować DefaultComboboxmodel implementując ListSelectionModel lub użyć detektorów do synchronizacji stanu selekcji (ale uważaj, aby uniknąć nieskończonych pętli). (I powinieneś ustawić tryb wyboru na "SINGLE_SELECTION".) –

5

Można je dzielić ten sam model, prawdopodobnie DefaultComboBoxModel ponieważ realizuje ListModel a więc powinien działać zarówno JComboBox i JList. Na przykład:

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

Problem rozwiązany. Wielkie dzięki! –