2011-02-08 14 views
8

Java Swing'de, JList ve JComboBox için verilerin en iyi yolu, veriler açısından senkronize edilmek, yani belirli bir zamanda aynı öğe listesine sahip olmak için nedir? Temel olarak, bir öğeye öğe eklerseniz (veya öğeleri kaldırırsam) diğeri değişikliği otomatik olarak yansıtmalıdır.Senkronize JList ve JComboBox?

ben aşağıdakileri yaparak denedim, ancak işe görünmüyor: her ikisi için çalışması gerekir böylece

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

cevap

10

Modelleriniz - combobox için liste için ListModel ve ComboboxModel - Gerek senkronize edilecek.

genel durumda bu modellerin özel bir uygulama yazma anlamına geleceğini, ancak durumda şans: DefaultComboBoxModel aslında ListModel uygular, böylece sadece hem bileşenleri için aynı modeli nesnesini kullanabilirsiniz.

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

API'ları temizledikten sonra bile bunu düşünmediğime inanamıyorum. Mükemmel çalıştı. Yardımın için çok teşekkürler! –

+1

Öğeleri senkronize etmek için düzgün, ancak seçilen öğeyi senkronize etmenin basit bir yolu var mı? – HpTerm

+0

@HpTerm: Bu kadar kolay değil. Liste ayrı bir ListSelectionModel ise Comboboxmodel seçimi kendisi yönetir. DefaultComboboxmodel ListSelectionModel uygulamasını alt sınıflara ayırabilir veya seçim durumunu senkronize etmek için dinleyicileri kullanabilirsiniz (ancak sonsuz döngüden kaçınmaya dikkat edin). (Ve seçim modunu "SINGLE_SELECTION" olarak ayarlamalısınız.) Yanıt için –

5

Bunu ListModel uygulayan beri onları aynı model, muhtemelen DefaultComboBoxModel paylaşmak olabilir ve JComboBox ve JList. Örneğin:

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

Sorun çözüldü. Çok teşekkürler! –