【问题标题】:If JComboBox is editable, how to cast the entered string to object?如果 JComboBox 是可编辑的,如何将输入的字符串转换为对象?
【发布时间】:2017-04-29 10:34:50
【问题描述】:

所以我有这个类“会员”:

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



}

我有一个可编辑的 JComboBox,并且 ComboBox 的模型是 DefaultComboBoxModel。

所以问题是如果我投射 selectedItem:

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

它只检查输入的字符串是否为空。如果我输入像“名称,位置”这样的字符串,我总是会得到字符串不能转换为成员的异常。我必须输入哪个字符串才能将字符串强制转换为成员?

这是我的 JComboBox:

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

这里是全局变量:

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

【问题讨论】:

    标签: java casting jframe jcombobox


    【解决方案1】:
    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);
    }
    

    【讨论】:

    • 但我希望如果我从 memberModel 中选择一个 MEMBER,我就不必拆分它。像 selectedMem = (Member) memberModel.getSeletedItem()。在这种情况下,我必须每次拆分字符串并将其转换为成员。所以不用每次都分裂,因为我已经有Member了
    【解决方案2】:

    字符串拆分&转换方法

    你可以做的是首先测试你得到的字符串是否为空,或者它是否与你的格式匹配。然后,您可以使用这些元素创建一个新对象。

    这是一个小示例代码:

    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 方法

    Java 7 出现了扩展JComboBox 的新可能性,现在可以以JComboBox&lt;Type&gt; 的形式对其进行一般参数化(如ArrayLists)。因此,您可以使用getSelectedItem() 获得的对象现在可以转换为您在参数中提供给JComboBox 的泛型类型。唯一的问题是,当编辑JComboBox 时,就像您的情况一样,数据被转换为简单的String

    您可以在侦听器方法(我将使用ActionListener)中执行以下操作:

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

    但是这种方法的问题是你最终仍然使用第一种方法。

    【讨论】:

    • 但我希望如果我从 memberModel 中选择一个 MEMBER,我就不必拆分它。像 selectedMem = (Member) memberModel.getSeletedItem()。在这种情况下,我必须每次拆分字符串并将其转换为成员。所以不用每次都分裂,因为我已经有Member了
    • 好吧,你可以使用 Java 7 中的一个新东西,类似于JComboBox&lt;Member&gt; members,其中getSelectedItem() 的方法可以返回一个成员(我会测试它并告诉你它是否有效)
    • 我正在使用它,但问题是我无法将字符串转换为“成员”类..
    • 你能发布包含你的 JComboBox 和 JFrame 的代码吗?
    • 我目前正在尝试一个工作示例 ^^ 我成功地使用JComboBox.getSelectedItem() 获取对象,我现在正在尝试使用可编辑的 JComboBox
    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2012-03-19
    • 2023-01-13
    • 2018-07-19
    相关资源
    最近更新 更多