2016-12-04 5 views
0

Этот код неаккуратный, я бы также приветствовал некоторые отзывы об этом.Динамический контент JComboBox, основанный на содержимом другого JComboBox

Я пытаюсь изменить значение JComboBox на основе значения другого JComboBox. Существует дополнительное усложнение в том, что я использую дополнительный класс для определения того, какой массив строк вернется (см. Мой предыдущий вопрос).

В теории, код, который я должен работать:

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); 

и способ возвращения массива здания:

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"}; 
    } 
} 

Но, вместо того чтобы вернуться разборчивой строкой, она возвращает следующее :

[Ljava.lang.String;@917081d

Я понятия не имею, как декодировать это, хотя это похоже на ссылку на память. Где я иду не так?

+0

Для того, чтобы нам помочь вам, вы должны предоставить нам 'getBuildingList.buildingSelectList (String ARG)' метод, как это кажется, что это та часть, где-то испортится ... И вы действительно должны привыкнуть, чтобы начинать имена классов с заглавной буквы, потому что в противном случае это становится очень запутанным для кого-то другого, читающего ваш код. – Raven

+0

@Raven Я обычно называю классы в формате [LC] [UC +], где бы они ни находились используемые как под-объекты, а не первичные классы - существует методология, которая поддерживает это, хотя это не основанная на Java. Я технически программист на C# ... – Wolfish

+0

Хорошо, тогда ... Но мы все равно нуждаемся в этом методе;) – Raven

ответ

1

Хорошо, насколько я вижу, ваша проблема заключается в том, что вы добавляете полный массив строк как один элемент. Затем JCombobox преобразует его в одну строку, вызывая маркер toString(), который вызывает его отображение [Ljava.lang.String;@917081d.
Для того, чтобы содержимое вашего массива, который будет отображаться в виде отдельных записей в JComboBox вы должны очистить его, а затем добавить каждый элемент отдельно:

regBuildingSelectBox.removeAllItems(); 

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

И как вы просили дополнительную обратную связь на вашем коде .. Я бы предложил использовать перечисления вместо жестко закодированных массивов String. Это просто потенциальный источник ошибок

2

Если вы возвращаете массив строк для отображения в поле со списком, вам необходимо создать новый ComboBoxModel для добавления в поле со списком.

Например:

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

Является ли воссоздание модели совершенно необходимой? Я пробовал перебирать элементы в массиве, и это работало, кроме того, что он повторялся через массив дважды. Это чувствует ... очень сложно. Почему это необходимо? – Wolfish

+0

@ Wolfish, Воспроизведение модели очень просто. Каждый набор данных имеет свою собственную модель. Данные могут поступать откуда угодно. Он может быть жестко запрограммирован. Это может происходить из базы данных. Если бы это произошло из плоского файла. Решение очень многократно используется. – camickr