2016-05-14 7 views
2

Ich habe eine Person [] mit drei Personen (p1, p2, p3). Personenklasse hat zwei Attribute Name und E-Mail.Gemeinsame Nutzung des gleichen Modells zwischen zwei JComboBoxen

Ich möchte alle Namen von Person [] in einer JComboBox und alle E-Mails in einer anderen JComboBox hinzufügen.

Ich habe den folgenden Code verwendet.

Person p1 = new Person("Smith", "[email protected]"); 
    Person p2 = new Person("Tom", "[email protected]"); 
    Person p3 = new Person("John","[email protected]"); 

    Person[] per_arr = new Person[] { p1, p2, p3}; 

    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 
    JComboBox<String> combo1 = new JComboBox<String>(); 
    JComboBox<String> combo2 = new JComboBox<String>(); 

    for (Person p : per_arr) { 
     combo1.addItem(p.getName()); 
     combo2.addItem(p.getEmail()); 
    } 
    panel.add(combo1); 
    panel.add(combo2); 
    frame.setContentPane(panel); 
    frame.pack(); 
    frame.setVisible(true); 

Aber ich möchte nicht so verwendet werden. Ich möchte die beiden Kombinationsfelder mit demselben Modell verwenden. Ich versuchte mit DefaultComboBoxModel und Override getElementAt() Methode wie folgt.

public class MyModel extends DefaultComboBoxModel<Object> { 

public MyModel(Object[] items) { 
    super(items); 
} 

@Override 
public Object getElementAt(int index) { 
    if (super.getElementAt(index) instanceof Person) { 
     return (Person)super.getElementAt(index); 
    } else { 
     return null; 
    } 
} 

}

Die oben ComboBoxModel geben Sie mir nur die Person Objekte.

Die Frage ist, wie kann ich alle Namen von Person [] in einer JComboBox und alle E-Mails in einer anderen JComboBox mit dem gleichen ComboBoxModel hinzufügen.

Antwort

5

Verwenden Sie eine Instanz von ComboBoxModel und zwei Instanzen von JComboBox, die jeweils dasselbe Modell haben. Lassen Sie jedes JComboBox eine benutzerdefinierte renderer haben, die das gewünschte Person Attribut für das JComboBox anzeigt.

In dem folgenden Beispiel wird jede Combo seine eigene Instanz eines einzelnen Renderer, der die strategy pattern implementiert, eine Function<Person, String> vorbei, die die korrekte Attribut auswählt, wenn der Renderer genannt:

DefaultComboBoxModel model = new DefaultComboBoxModel(…); 
JComboBox<String> combo1 = new JComboBox<>(model); 
combo1.setRenderer(new PersonRenderer(Person::getName)); 
JComboBox<String> combo2 = new JComboBox<>(model); 
combo2.setRenderer(new PersonRenderer(Person::getEmail)); 

image

import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.util.function.Function; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 

/** 
* @see http://stackoverflow.com/a/37222598/230513 
*/ 
public class ComboRendererTest { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLayout(new FlowLayout()); 
     DefaultComboBoxModel model = new DefaultComboBoxModel(new Person[]{ 
      new Person("Alpher", "[email protected]"), 
      new Person("Bethe", "[email protected]"), 
      new Person("Gammow", "[email protected]")}); 
     JComboBox<String> combo1 = new JComboBox<>(model); 
     combo1.setRenderer(new PersonRenderer(Person::getName)); 
     JComboBox<String> combo2 = new JComboBox<>(model); 
     combo2.setRenderer(new PersonRenderer(Person::getEmail)); 
     f.add(combo1); 
     f.add(combo2); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private static class PersonRenderer extends DefaultListCellRenderer { 

     Function<Person, String> personAttribute; 

     public PersonRenderer(Function<Person, String> personAttribute) { 
      this.personAttribute = personAttribute; 
     } 

     @Override 
     public Component getListCellRendererComponent(JList<?> list, Object 
      value, int index, boolean isSelected, boolean cellHasFocus) { 
      JLabel l = (JLabel) super.getListCellRendererComponent(
       list, value, index, isSelected, cellHasFocus); 
      Person p = (Person) value; 
      l.setText(personAttribute.apply(p)); 
      return l; 
     } 
    } 

    private static class Person { 

     private final String name; 
     private final String email; 

     public Person(String name, String email) { 
      this.name = name; 
      this.email = email; 
     } 

     public String getName() { 
      return name; 
     } 

     public String getEmail() { 
      return email; 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new ComboRendererTest()::display); 
    } 
} 
+1

Danke für deine Detailerklärung .... du hast mir viel geholfen :-) –

Verwandte Themen