2011-02-08 13 views
8

Java Swingでは、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

リストのListModelとコンボボックスの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

問題を解決しました。どうもありがとう! –