javaswingglazedlists

glazedlists with ID in java


I am using glazedlists for JComboBox in java to make a JComboBox searchable and sortable. But there is situation I can't get to solve it.

I have a JComboBox attached with glazedlists. glazedlists takes String array to fill this combobox and make it searchable like this

String[] Values = {"ABC", "DEF", "GHI", "JKL", "MNO"};
JComboBox cmb = new JComboBox();
AutoCompleteSupport.install(cmb , GlazedLists.eventListOf(Values));

This works good but the problem is that I want to add ID along with value coming from Database and for that I am implementing my own custom ListCellRenderer like this

class MyListRenderer extends JLabel implements ListCellRenderer 
{
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Object[] itemData = (Object[])value;
        setText((String)itemData[1]);
        return this;
    }
}
cmb.setRenderer(new MyListRenderer());

And to add value in JComboBox, I have to

while(rs.next()){
    int id=rs.getInt("company_id");
    String category=rs.getString("company_name");
    Object[] itemData = new Object[] {id, category};
    cmb.addItem(itemData);
}

Now how can I implement my JComboBox with glazedlists while setting my own custom renderer?


Solution

  • Didn't have any success with your way, but I found a solution in an earlier project. You can set the model of the JComboBox instead by doing something like this:

    //load the list of objects to use
    ContainerClass[] allOptions = ContainerClass.getAll();
    
    //create an EventList with this list and set is as the combobox model
    final EventList<ContainerClass> eventList = GlazedLists.eventList(Arrays.asList(allOptions));
    comboBox.setModel(new DefaultComboBoxModel<ContainerClass>(allOptions));
    
    //finally initialize the combobox by SwingUtilities if done on a non-UI thread
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            AutoCompleteSupport<ContainerClass> install = 
                    AutoCompleteSupport.install(comboBox, eventList);
            install.setFilterMode(TextMatcherEditor.CONTAINS);
            install.setHidesPopupOnFocusLost(true);
            install.setSelectsTextOnFocusGain(false);
            install.setCorrectsCase(false);
        }
    });
    

    And with a ContainerClass like:

    class ContainerClass{
         int id;
         String company;
    
         //helper method to get all the objects needed
         static ContainerClass[] getAll(){
              ContainerClass test = new ContainerClass();
              test.id = 2;
              test.company = "abc";
              return new ContainerClass[]{test,test,test};
         }
    
         @Override
         //this String is what actually will be displayed in the combobox
         public String toString(){return "(" + id + ") " + company;}
    }
    

    And I'm assuming that your JComboBox has the following type:

    JComboBox<ContainerClass> comboBox;
    

    (I had to obfuscate the names of all variables, so there might be errors in the code. Let me know and I will correct them)

    So to recap. GlazedLists uses the model to get the names, which again asks the ContainerClass for it's toString() method which will return the name to display in the JComboBox.

    As a note, when you call comboBox.getSelectedItem() it will return an object of type ContainerClass, or null if it isn't a valid selection.

    UPDATE

    If you want to be able to control the order as well as the name, you would need to implement your own model for the ComboBox. Found this that seems to explain it well:

    class MyComboBoxModel extends AbstractListModel implements ComboBoxModel {   
      String[] ComputerComps = { "Monitor", "Key Board", "Mouse", "Joy Stick", 
                     "Modem", "CD ROM", "RAM Chip", "Diskette" };
    
      String selection = null;
    
      public Object getElementAt(int index) {
        return ComputerComps[index];   
      }
    
      public int getSize() {
        return ComputerComps.length;   
      }
    
      public void setSelectedItem(Object anItem) {
        selection = (String) anItem; // to select and register an   
      } // item from the pull-down list
    
      // Methods implemented from the interface ComboBoxModel   
      public Object getSelectedItem() {
           return selection; // to add the selection to the combo box   
      } 
    }