保留JOptionPane的引用,返回特定的类

时间:2013-12-13 13:58:34

标签: java swing

我想使用组合框中显示的不同选项实现 Swing输入对话框。我的具体情况是联系创建,最终用户可以在现有的联系人之间进行选择,也可以自己创建一个新的联系人

所以我有这个静态方法,基本上返回一个JOptionPane的新实例,它具有开箱即用的可用选择对象。请注意,此代码创建,假设父对话框,它提供选择现有联系人或单击按钮以创建新联系人:

enter image description here

/**
 * 
 * @param message
 *            Here I've got a JPanel which allows the end user to show-hide
 *            the Contact creation dialog
 * @param contacts
 *            Contact possibilities
 * @return reference to the created JOptionPane
 */
public static JOptionPane newContactOptionPane(Object message,
        Set<XmlContact> contacts) {
    Object[] contactPossibilities = new Object[contacts.size()];
    int index = 0;
    for (XmlContact contct : contacts) {
        contactPossibilities[index] = String.format("%s %s, %s",
                contct.get_Surname1(), contct.get_Surname2(),
                contct.get_Name());
        index++;
    }
    JOptionPane optPane = new JOptionPane();
    JOptionPane.showInputDialog(optPane, message, "Seleccionar Contacto",
            JOptionPane.QUESTION_MESSAGE, null, contactPossibilities,
            contactPossibilities[0]);
    return optPane;
}

调用程序代码类似于:

JOptionPane contactSelectionPane = 
    ViewUtils.newContactOptionPane(createContactPanel, xmlContacts);
XmlContact selectedContact = 
    (XmlContact) contactSelectionPane.getValue();

稍后,我想使用JOptionPane#getValue()方法恢复所选值。

当点击 Crear nuevo contacto 时,所需的行为是显示联系人创建的表单,因此以前的JDialog将被隐藏:

enter image description here

我有两个理由在引用代码中保留引用,第一个是因为我想包装选项窗格使它返回XmlContact对象而不是字符串并且必须搜索它再一次在我的调用程序代码中可能的选项一次又一次。另一个是因为我希望保留contactSelectionPane的引用,以便将按钮设置为createContactPanel来显示/隐藏它。

现在contactSelectionPane.getValue()显然正在返回String,这迫使我再次检查选项。我该如何实现呢?

2 个答案:

答案 0 :(得分:1)

你为什么不这样做:

public class Option<X> {
    private final X value;
    private final String name;

    public String toString() {
         return name;
    }

    public X getValue() {
         return value;
    }

    public Option(X value, String name) {
         this.value=value;
         this.name=name;
    }
}

public static JOptionPane newContactOptionPane(Object message,
        Set<XmlContact> contacts) {
    Object[] contactPossibilities = new Object[contacts.size()];
    int index = 0;
    for (XmlContact contct : contacts) {
        contactPossibilities[index] = new Option<XmlContact>(contct, String.format("%s %s, %s",
                contct.get_Surname1(), contct.get_Surname2(),
                contct.get_Name()));
        index++;
    }
    JOptionPane optPane = new JOptionPane();
    JOptionPane.showInputDialog(optPane, message, "Seleccionar Contacto",
            JOptionPane.QUESTION_MESSAGE, null, contactPossibilities,
            contactPossibilities[0]);
    return optPane;
}

以后你会这样做:

JOptionPane contactSelectionPane = 
    ViewUtils.newContactOptionPane(createContactPanel, xmlContacts);
XmlContact selectedContact = 
    ((Option<XmlContact>) contactSelectionPane.getValue()).getValue();

希望有所帮助。

编辑:

关于创建新的XmlContact,我只需在Option类似的可用选项列表中添加额外的new Option<XmlContact>(new XmlContact(...), "Create new contact...");

答案 1 :(得分:1)

我会使用SelectionChangedListener来获取JComboBox中的实际选定项目。

为了获得新的XmlContact,我会使用某种变量来记住创建的XmlContact。

最后,我将从JOptionPane派生一个新类,其中我重写了getValue方法,在该方法中,我从JComboBox获取新的XmlContact或选定的一个。然后使用此类而不是纯JOptionPane。