2016-12-04 5 views
0

Dieser Code ist schlampig, ich würde auch ein Feedback dazu begrüßen.Dynamischer JComboBox-Inhalt basierend auf dem Inhalt einer anderen JComboBox

Ich versuche, den Wert einer JComboBox basierend auf dem Wert einer anderen JComboBox zu ändern. Es gibt eine zusätzliche Komplikation darin, dass ich eine zusätzliche Klasse verwende, um zu bestimmen, welches Array von Zeichenfolgen zurückgegeben werden soll (siehe meine vorherige Frage).

In der Theorie der Code Ich habe funktionieren soll:

String[] siteSelectStrings = {"Site", "London", "Long Island"}; 
    JComboBox regSiteSelectBox = new JComboBox(siteSelectStrings); 
    regSiteSelectBox.addItemListener(new ItemListener() { 
     public void itemStateChanged(ItemEvent arg0) { 
      getBuildingList gbl = new getBuildingList(); 
      regBuildingSelectBox.addItem(gbl.buildingSelectList((String)(regSiteSelectBox.getSelectedItem()))); 
      } 
     }); 
    regSiteSelectBox.setBounds(24, 336, 282, 20); 
    contentPane.add(regSiteSelectBox); 


    regBuildingSelectBox = new JComboBox(); 
    regBuildingSelectBox.setBounds(24, 367, 282, 20); 
    contentPane.add(regBuildingSelectBox); 

und das Verfahren zur Rückführung des Gebäude Array:

public class getBuildingList { 

public String[] buildingSelectList(String site) 
{ 
    switch (site) 
    { 
    case "London": 
     return new String[] {"Building", "Harvell", "LYNX Complex", "Caroline", "Salters"}; 
    case "Long Island": 
     return new String[] {"Building", "Phillips", "Pascal"}; 
    } 
    return new String[] {"Failed to populate buildings"}; 
    } 
} 

Aber anstatt eine lesbare Zeichenfolge zurückzugeben, gibt es die folgenden :

[Ljava.lang.String;@917081d

ich habe keine Ahnung wie man das entschlüsselt, obwohl es wie eine Gedächtnisreferenz aussieht. Wo gehe ich falsch?

+0

Damit wir Ihnen helfen, haben Sie uns das 'getBuildingList.buildingSelectList (String arg)' Methode zur Verfügung zu stellen, wie es scheint, dass dies der Teil ist, wo aufsteht etwas messed ... Und Sie sollten sich wirklich daran gewöhnen, Klassennamen mit einem Großbuchstaben zu beginnen, denn sonst wird es für jemanden, der Ihren Code liest, sehr verwirrend. – Raven

+0

@Raven Ich nenne Klassen im Format [LC] [UC +], wo auch immer sie sind Sie werden als Unterobjekte anstelle von Primärklassen verwendet - es gibt eine Methode, die dies unterstützt, obwohl sie nicht auf Java basiert. Ich bin technisch ein C# -Programmierer ... – Wolfish

+0

Okay dann ... Aber wir brauchen immer noch diese Methode;) – Raven

Antwort

1

Okay, soweit ich es sehen kann ist Ihr Problem, dass Sie die komplette Reihe von Strings als ein Element hinzufügen. Die JCombobox wandelt sie dann in eine einzelne Zeichenfolge um, indem sie die toString() -Methode aufruft, die bewirkt, dass sie [Ljava.lang.String;@917081d anzeigt.
Um für den Inhalt Ihres Arrays als einzelne Einträge in den JComboBox Sie es deaktivieren müssen angezeigt werden und dann jedes Element hinzufügen seperat:

regBuildingSelectBox.removeAllItems(); 

for(String currentEntry : gbl.buildingSelectList((String)(regSiteSelectBox.getSelectedItem())) { 
     regBuildingSelectBox.addItem(currentEntry); 
} 

Und wie Sie für zusätzliches Feedback zu Ihrem Code gefragt .. Ich würde vorschlagen, Enums anstelle von hart codierten String-Arrays zu verwenden. Das ist nur eine mögliche Fehlerquelle.

2

Wenn die Methode ein Array von Zeichenfolgen zurückgibt, die im Kombinationsfeld angezeigt werden sollen, müssen Sie ein neues ComboBoxModel erstellen, das zum Kombinationsfeld hinzugefügt wird.

Zum Beispiel:

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.*; 

public class ComboBoxTwo extends JPanel implements ActionListener 
{ 
    private JComboBox<String> mainComboBox; 
    private JComboBox<String> subComboBox; 
    private Hashtable<String, String[]> subItems = new Hashtable<String, String[]>(); 

    public ComboBoxTwo() 
    { 
     String[] items = { "Select Item", "Color", "Shape", "Fruit" }; 
     mainComboBox = new JComboBox<String>(items); 
     mainComboBox.addActionListener(this); 

     // prevent action events from being fired when the up/down arrow keys are used 
     mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 
     add(mainComboBox); 

     // Create sub combo box with multiple models 

     subComboBox = new JComboBox<String>(); 
     subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4 
     add(subComboBox); 

     JButton arrow = SwingUtils.getDescendantOfType(JButton.class, subComboBox, "Text", ""); 
     Dimension d = arrow.getPreferredSize(); 
     System.out.println(arrow.getClass()); 
     System.out.println(d); 
     d.width = 100; 
     arrow.setPreferredSize(d); 

     String[] subItems1 = { "Select Color", "Red", "Blue", "Green" }; 
     subItems.put(items[1], subItems1); 

     String[] subItems2 = { "Select Shape", "Circle", "Square", "Triangle" }; 
     subItems.put(items[2], subItems2); 

     String[] subItems3 = { "Select Fruit", "Apple", "Orange", "Banana" }; 
     subItems.put(items[3], subItems3); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     String item = (String)mainComboBox.getSelectedItem(); 
     Object o = subItems.get(item); 

     if (o == null) 
     { 
      subComboBox.setModel(new DefaultComboBoxModel()); 
     } 
     else 
     { 
      subComboBox.setModel(new DefaultComboBoxModel((String[])o)); 
     } 
    } 

    private static void createAndShowUI() 
    { 
     try 
     { 
//   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception e) { } 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new ComboBoxTwo()); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

Ist das Modell vollständig neu zu erstellen? Ich habe versucht, durch die Elemente im Array zu iterieren, und das funktionierte abgesehen von der Tatsache, dass es zweimal durch das Array iterierte. Das fühlt sich ... sehr komplex an. Warum ist es notwendig? – Wolfish

+0

@Wolfish, Nachbildung des Modells hält die Lösung sehr einfach. Jeder Datensatz hat sein eigenes Modell. Die Daten könnten von überall her kommen. Es könnte fest codiert sein. Es könnte aus einer Datenbank stammen. Wenn es aus einer flachen Datei kommen könnte. Die Lösung ist sehr wiederverwendbar. – camickr

Verwandte Themen