2013-06-03 2 views
1

У меня есть несколько combobox в моем графическом интерфейсе, которые все должны иметь данные. Эти данные будут изменяться случайным образом, поэтому необходим быстрый способ сохранить все синхронизированные значения. Я столкнулся с DefaultComboBoxModel, который на самом деле подходит совершенно. Единственное, что мне нужно, чтобы comboboxes были независимы друг от друга - это означает: если я выберу значение на одном, все остальные не должны меняться. Я провел небольшое исследование и прочитал стандартные учебники по java, но никто не говорит мне, как это сделать с помощью DefaultComboBoxModel.Поделиться источником данных для двух comboboxes

Этот пример здесь точно иллюстрирует то, что мне нужно: Sharing the Data Model between two JComboBoxes За исключением того, что выбранный индекс не должен меняться при выборе одного из них.

This Question спросил уже совсем аналогичную вещь, но я не мог разобраться, как подойти к «украшению».

Есть ли способ предотвратить изменение или, например, использовать обычный массив для синхронизации значений?

Может быть кто-то может дать мне быстро пощечину с рыбой, так как решение, вероятно, очень просто ...

+0

Maby Я вас неправильно понял, но зачем использовать два разных экземпляра 'DefaultComboBoxModel'? Оба содержат одни и те же данные. И, согласно изменениям данных, вам все равно нужно обновить модель. –

+0

Ну, это был бы вариант, но потом я мог просто напрямую манипулировать элементами. Просто я не хочу создавать 10 разных моделей и добавлять/удалять элементы для каждой модели. Я просто хочу поддерживать один массив или модель и обновлять все последующие комбобокс. К сожалению, если я просто передаю массив конструктору, значения не будут обновляться, когда элемент будет добавлен ... – xXx

ответ

4

Я думаю, что это то, что объяснил Робин в ответе вы упоминались в сообщении. Вы переносите оригинальную модель со списком в 2 отдельные модели со списком, которые полагаются на исходную для элементов данных, но реализуют свою собственную модель выбора.

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ComboBoxModel; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ListDataEvent; 
import javax.swing.event.ListDataListener; 

public class SharedDataBetweenComboBoxSample { 

    public static class MyComboBoxModel extends DefaultComboBoxModel implements ComboBoxModel, ListDataListener { 
     private DefaultComboBoxModel original; 

     public MyComboBoxModel(DefaultComboBoxModel original) { 
      super(); 
      this.original = original; 

     } 

     @Override 
     public int getSize() { 
      return original.getSize(); 
     } 

     @Override 
     public Object getElementAt(int index) { 
      return original.getElementAt(index); 
     } 

     @Override 
     public void addListDataListener(ListDataListener l) { 
      if (getListDataListeners().length == 0) { 
       original.addListDataListener(this); 
      } 
      super.addListDataListener(l); 
     } 

     @Override 
     public void removeListDataListener(ListDataListener l) { 
      super.removeListDataListener(l); 
      if (getListDataListeners().length == 0) { 
       original.removeListDataListener(this); 
      } 
     } 

     @Override 
     public void addElement(Object anObject) { 
      original.addElement(anObject); 
     } 

     @Override 
     public void removeElement(Object anObject) { 
      original.removeElement(anObject); 
     } 

     @Override 
     public int getIndexOf(Object anObject) { 
      return original.getIndexOf(anObject); 
     } 

     @Override 
     public void insertElementAt(Object anObject, int index) { 
      original.insertElementAt(anObject, index); 
     } 

     @Override 
     public void removeAllElements() { 
      original.removeAllElements(); 
     } 

     @Override 
     public void removeElementAt(int index) { 
      original.removeElementAt(index); 
     } 

     @Override 
     public void intervalAdded(ListDataEvent e) { 
      fireIntervalAdded(this, e.getIndex0(), e.getIndex1()); 
     } 

     @Override 
     public void intervalRemoved(ListDataEvent e) { 
      fireIntervalRemoved(this, e.getIndex0(), e.getIndex1()); 
     } 

     @Override 
     public void contentsChanged(ListDataEvent e) { 
      fireContentsChanged(this, e.getIndex0(), e.getIndex1()); 
     } 

    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final String labels[] = { "A", "B", "C", "D", "E", "F", "G" }; 

       final DefaultComboBoxModel model = new DefaultComboBoxModel(labels); 

       JFrame frame = new JFrame("Shared Data"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JPanel panel = new JPanel(); 
       JComboBox comboBox1 = new JComboBox(new MyComboBoxModel(model)); 
       comboBox1.setEditable(true); 

       JComboBox comboBox2 = new JComboBox(new MyComboBoxModel(model)); 
       comboBox2.setEditable(true); 
       panel.add(comboBox1); 
       panel.add(comboBox2); 
       frame.add(panel, BorderLayout.NORTH); 

       JButton button = new JButton("Add"); 
       frame.add(button, BorderLayout.SOUTH); 
       ActionListener actionListener = new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent actionEvent) { 
         model.addElement("New Added"); 
        } 
       }; 
       button.addActionListener(actionListener); 

       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

+1 для SSCCE, но не хорошее предложение ..., чтобы использовать MutableComboBoxModel для чего бы то ни было во время выполнения для уже видимого JComboBox, значительного отличия – mKorbel

+0

@mKorbel Я не понимаю, почему это не будет хорошим предложением. Не могли бы вы объяснить мне? ;-) –

+0

посмотреть мою удаленную запись с комментариями о Item был вставлен/удален до выбранного пункта, при индексировании уменьшен – mKorbel