2011-02-08 34 views
8

Trong Java Swing, cách tốt nhất cho một JListJComboBox để được đồng bộ hóa về dữ liệu, tức là, để có cùng một danh sách các mục tại bất kỳ thời điểm nhất định nào? Về cơ bản, nếu tôi thêm các mục vào (hoặc xóa các mục từ), mục kia sẽ phản ánh thay đổi tự động.JListboBox đã đồng bộ hóa và JComboBox?

tôi đã cố gắng làm những điều sau đây, nhưng nó dường như không làm việc:

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

Trả lời

10

Mô hình của bạn - ListModel cho danh sách và ComboboxModel cho combobox - cần được đồng bộ hóa.

Trong trường hợp chung, điều này có nghĩa là viết một mô hình đặc biệt, nhưng trong trường hợp bạn có may mắn: DefaultComboBoxModel thực tế thực hiện ListModel, vì vậy bạn có thể sử dụng cùng một đối tượng mô hình cho cả hai thành phần của bạn.

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

Tôi không thể tin rằng tôi đã không nghĩ về điều đó ngay cả sau khi xóa bỏ các API. Nó hoạt động hoàn hảo. Cảm ơn sự giúp đỡ của bạn! –

+1

Gọn gàng để đồng bộ hóa các mục, nhưng có cách nào đơn giản để đồng bộ hóa mục đã chọn không? – HpTerm

+0

@HpTerm: Không dễ như vậy. Comboboxmodel quản lý việc lựa chọn chính nó, trong khi danh sách có một ListSelectionModel riêng biệt. Bạn có thể phân lớp DefaultComboboxmodel triển khai ListSelectionModel, hoặc sử dụng các trình nghe để đồng bộ hóa trạng thái lựa chọn (nhưng cẩn thận để tránh các vòng vô hạn). (Và bạn nên đặt chế độ chọn thành 'SINGLE_SELECTION'.) –

5

Bạn có thể có người đều chia sẻ cùng một mô hình, có thể là một DefaultComboBoxModel vì nó thực hiện ListModel và do đó nên làm việc cho cả hai JComboBox và JList. Ví dụ:

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

Sự cố được giải quyết. Cảm ơn rất nhiều! –

Các vấn đề liên quan