2011-02-08 11 views
8

जावा स्विंग में, डेटा के संदर्भ में 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 बता गया के लिए - जरूरत सिंक्रनाइज़ किया जाना है।

सामान्य मामले में इसका मतलब मॉडल के विशेष कार्यान्वयन को लिखना होगा, लेकिन आपके मामले में आपके पास भाग्य है: डिफ़ॉल्ट रूप से डिफ़ॉल्ट कॉम्बोबॉक्स मॉडल वास्तव में सूची मॉडल लागू करता है, इसलिए आप बस अपने घटकों दोनों के लिए एक ही मॉडल ऑब्जेक्ट का उपयोग कर सकते हैं।

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

मुझे विश्वास नहीं है कि मैंने एपीआई को खराब करने के बाद भी ऐसा नहीं सोचा था। यह पूरी तरह से काम किया। आपकी सहायता के लिए धन्यवाद! –

+1

वस्तुओं को सिंक्रनाइज़ करने के लिए नीट, लेकिन क्या चयनित आइटम को सिंक्रनाइज़ करने का एक आसान तरीका है? – HpTerm

+0

@HpTerm: इतना आसान नहीं है। Comboboxmodel स्वयं चयन का प्रबंधन करता है, जबकि सूची में एक अलग ListSelectionModel है। आप ListCelectionModel को कार्यान्वित करने वाले DefaultComboboxmodel को उपclass कर सकते हैं, या चयन स्थिति को सिंक्रनाइज़ करने के लिए श्रोताओं का उपयोग कर सकते हैं (लेकिन अनंत लूप से बचने के लिए सावधानी बरतें)। (और आपको चयन मोड को 'SINGLE_SELECTION' पर सेट करना चाहिए।) –

5

आप उन्हें एक ही मॉडल, शायद एक DefaultComboBoxModel का हिस्सा है, क्योंकि यह ListModel लागू करता है हो सकता है और इस तरह जेसीम्बोबॉक्स और जेएलिस्ट। उदाहरण के लिए:

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

समस्या हल हो गई। आपका बहुत बहुत धन्यवाद! –

संबंधित मुद्दे