2011-02-08 3 views
8

자바 스윙에서 JListJComboBox을 동기화하여 데이터를 동기화하는 가장 좋은 방법은 무엇입니까? 즉, 특정 시점에서 동일한 항목 목록을 유지하는 것이 가장 좋습니다. 기본적으로 항목을 항목에 추가하거나 제거하는 경우 다른 항목은 자동으로 변경 사항을 반영해야합니다.동기화 된 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

목록의 목록 모델과 콤보 박스의 ComboboxModel이 동기화되어야합니다.

일반적으로 이것은 모델의 특수한 구현을 작성하는 것이지만, 실제로는 행운을 빕니다. DefaultComboBoxModel은 실제로 ListModel을 구현하므로 두 구성 요소 모두에 동일한 모델 객체를 사용할 수 있습니다.

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

나는 API를 닦은 후에도 그렇게 생각하지 않았다. 그것은 완벽하게 작동했습니다. 도와 주셔서 정말로 고맙습니다! –

+1

항목을 동기화하는 데는 알 맞지 만 선택한 항목을 동기화하는 간단한 방법이 있습니까? – HpTerm

+0

@HpTerm : 그리 쉽지 않습니다. 콤보 박스 모델은 선택 항목 자체를 관리하지만 목록에는 별도의 ListSelectionModel이 있습니다. ListSelectionModel을 구현하는 DefaultComboboxmodel을 서브 클래스화할 수도 있고 리스너를 사용하여 선택 상태를 동기화 할 수도 있습니다 (단, 무한 루프를 피할 수 있도록주의하십시오). (그리고 선택 모드를'SINGLE_SELECTION'으로 설정해야합니다.) –

5

당신은 그것의 ListModel를 구현하기 때문에 그들이 동일한 모델, 아마 된 DefaultComboBoxModel을 공유 할 수 및 JComboBox 및 JList 예 :

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

문제가 해결되었습니다. 고마워요! –