igodie
igodie

Reputation: 537

If JComboBox is editable, how to cast the entered string to object?

So I have this class "Member" :

package pkgData;

import java.io.Serializable;

public class Member implements Comparable<Member>, Serializable{
  /**
  * 
  */
  private static final long serialVersionUID = 1L;
  private String name;
  private String city;

  public Member(String nameOfMember,String location) {
      super();
      this.name = nameOfMember;
      this.city=location;
  }


  public String getNameOfMember() {
      return name;
  }

  public String getLocationOfMember() {
      return city;
  }

  public void setNameOfMember(String nameOfMember) {
      this.name = nameOfMember;
  }


  @Override
  public String toString() {
      return name +", " + city;
  }


  @Override
  public int compareTo(Member o) {
      int result =this.getNameOfMember().compareTo(o.getNameOfMember());

      if(result==0){
          result = this.getLocationOfMember().compareTo(o.getLocationOfMember());
      }

      return result;
  }



}

And I have a JComboBox which is EDITABLE and the model of the ComboBox is DefaultComboBoxModel.

So the problem is that if I cast the selectedItem:

Member nameOfMember = (Member)memberModel.getSelectedItem();            
    if(nameOfMember== null)
        throw new Exception("please select a name and a location"); 

It only checks if the entered string is empty. If I enter a string like "Name, Location" I always get the exception that String cannot be cast to Member. Which String to I have to enter that the String can be cast to Member?

Here is my JComboBox:

private JComboBox<Member> getComboBoxMember() {
    if (comboBoxMember == null) {
        comboBoxMember = new JComboBox<Member>();
        comboBoxMember.setEditable(true);
        comboBoxMember.setModel(memberModel);
    }
    return comboBoxMember;
}

and here the global variables:

private DefaultComboBoxModel<Member> memberModel;
private JComboBox<Member> comboBoxMember;

Upvotes: 1

Views: 369

Answers (2)

cocosushi
cocosushi

Reputation: 144

String split & cast method

What you can do is first of all test if the string you get is null, or if it matches well you format. Then, you can create a new object with these elements.

Here's a small example code :

String memberData = (String)memberModel.getSelectedItem();
if(memberData == null || memberData.split(", ")[0].isEmpty() || memberData.split(", ")[1].isEmpty()) {
    throw new Exception("Data is incorrect, please provide name and location separated with ", ");
}
Member member = new Member(memberData.split(", ")[0], memberData.split(", ")[1]);

JComboBox method

With Java 7 happened a new possibility of extension to JComboBox, which can now be generically parameterized (as for ArrayLists) in the form JComboBox<Type>. Thus, the objects you can get with getSelectedItem() can now be casted to the generic type you gave in parameter to JComboBox. The only problem is that, when a JComboBox is edited, as in your case, the data is casted to a simple String.

What you can do in your listener method (I will use ActionListener) is the following :

class ItemAction implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        try {
            //In case the user has not modified the object
            Member member = (Member)box.getSelectedItem();
            //Just an example here
            if(member != null) {
                System.out.println(member.toString());
            }
        } catch(ClassCastException ex) {
            //In case the object has been modified
            String data = (String)box.getSelectedItem();
            //Apply first method here
        }

    }
}

But the problem with this method is that you end up using the first method still.

Upvotes: 0

Thejana
Thejana

Reputation: 71

String nameOfMember = (String) memberModel
        .getSelectedItem();if(nameOfMember==null)throw new Exception("please select a name and a location");else

{
String[] parts = nameOfMember.split(",");
String part1 = parts[0]; // name
String part2 = parts[1]; // location
Member member=new Member(part1, part2);
}

Upvotes: 7

Related Questions