Java Swing - DefaultListModel - Printing all object information, when i only want to print one field

1k views Asked by At

I have this DefaultListModel

DefaultListModel listModel;
//constructor does the right hting... etc.. I skipped over a lot of code
JList jlist_available_items; 
....
jlist_available_items= new JList(cartModel); //etc

Everything is working almost perfectly the issue is that

listModel.addElement(product); 

if I change it to product.name it will look correctly, but behave wrongly [the object itself won't be accesisble, only the name]

Is adding the object to the view, and all I want to add is the object name.

When I change it to the name it causes all sorts of issues, because I store the objects in a hashmap, and the hashmap uses objects as keys, not the product.name string.

The reason is so that this method can search the hashmap for the right object.

  for (Product p : store.database.keySet()) {
    if (jlist_available_items.getSelectedValuesList().contains(
        (Product) p)) { // if item is selected
        cart.addItem(p);
    }
  }

How can I fix this?? I have been trying to fix it and related bugs for almsot two hours = ( !

Also sample output is

Product [description=descrion test, name=test]

That is what it is printing. I just want it to print the name. = (!

Also the objects are in a hashmap. I can just iterate through the hashmap until an object has the same name value and then use that, but I don't want to. I want a more proper and scalable solution, namely because I am having so much trouble thinking of one.

BY THE WAY! This is a GUI app in Swing! If you want images just ask = )!

EDIT: And now nmy list cell renderer is broken! It was working just a moment ago... = (

    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {

        Product product = (Product) value;

        return this;
       }
    }
1

There are 1 answers

1
JB Nizet On BEST ANSWER

By default, the toString() method of the objects in the model is called to display the list element. And your Product.toString() method returns Product [description=descrion test, name=test].

If you want to display something else, then use a ListCellRenderer, as explained in the swing tutorial about JList.

EDIT: your renderer has a bug: it doesn't set the text of the returned component (which is a JLabel). It should be:

Product product = (Product) value;
setText(product.getName());
return this;