Синхронизированы JList и JComboBox? - PullRequest
8 голосов
/ 09 февраля 2011

В Java Swing, как лучше всего синхронизировать 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()));

Ответы [ 2 ]

10 голосов
/ 09 февраля 2011

Ваши модели - 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);
5 голосов
/ 09 февраля 2011

Можно сделать так, чтобы они использовали одну и ту же модель, возможно DefaultComboBoxModel, поскольку она реализует ListModel и, следовательно, должна работать как с 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);
      }
 }
...