摆动:在一组物体中进行选择

时间:2010-11-02 14:35:53

标签: java swing joptionpane

我需要一个静态实用工具方法来从List<T>中选择对象。我遇到了两个问题。这是一个简短的测试程序:

package com.example.test.gui;

import java.util.Arrays;
import java.util.List;
import javax.swing.JOptionPane;

public class SelectionTest {
    public interface NameExtractor<T> {
        public String extractName(T object);
    }

    static public <T> T selectFromList(String message, List<T> list, NameExtractor<T> nameExtractor) {
        String[] choices = new String[list.size()];
        int i = 0;
        for (T t : list)
            choices[i++] = nameExtractor.extractName(t);
        Object s = JOptionPane.showInputDialog(null, message, "",
                JOptionPane.QUESTION_MESSAGE, null, choices, null);
        System.out.println(s);
        // crap, we get a string back. Now how do we get back the object in question?
        return null;
    }

    static public void main(String[] args)
    {
        List<Integer> numbers = Arrays.asList(1,2,3,4,10);
        System.out.println(selectFromList("Pick one", numbers, new NameExtractor<Integer>(){
            @Override public String extractName(Integer object) {
                return object.toString();
            }
        }));
    }
}

是否有JOptionPane.showInputDialog()的替代方法可以让我获取列表的索引而不是显示的字符串?

编辑我宁愿强制使用JList而不是组合框或者JOptionPane想要的任何默认值。

3 个答案:

答案 0 :(得分:2)

为什么不直接将对象放入JOptionPane而不是放入一个字符串数组? JOptionPane将调用对象的toString方法以进行显示。

    Object selectedObject = JOptionPane.showInputDialog(null, message, "",
            JOptionPane.QUESTION_MESSAGE, null, list.toArray(), null);

    return (T)selectedObject;

搜索所选名称的名称并返回对象:

    for(int j = 0 ; j < choices.length; j++){
        if(selectedObject.equals(choices[j])){
            return list.get(j);
        }
    }
    return null;

答案 1 :(得分:2)

我最终做了以下操作,看起来有点笨重,所以如果其他人想出一个更干净的方法来做这件事,我会接受你的回答。

/**
 * @param <T> element class
 * @param title dialog title
 * @param message message
 * @param list list
 * @param nameExtractor gets names from element
 * @return item from the list
 */
static public <T> T selectFromList(String title, String message, List<T> list, NameExtractor<T> nameExtractor) {
    JPanel p = new JPanel();
    JList jlist = new JList();
    DefaultListModel model = new DefaultListModel();
    for (T t : list)
        model.addElement(nameExtractor.extractName(t));
    jlist.setModel(model);
    p.setLayout(new BorderLayout());
    p.add(new JLabel(message), BorderLayout.NORTH);
    p.add(jlist, BorderLayout.CENTER);
    JOptionPane op = new JOptionPane(p, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
    JDialog d = op.createDialog(title);
    d.setVisible(true);
    Object sel = op.getValue();
    int i = jlist.getSelectedIndex();
    d.dispose();
    if (i != -1 && sel instanceof Integer && (Integer)sel == JOptionPane.OK_OPTION)
        return list.get(i);
    else
        return null;
}

答案 2 :(得分:2)

  

是否有替代JOptionPane.showInputDialog()允许我获取列表的索引而不是显示的字符串?

所有选项窗格showXXX方法都允许您将任何对象直接添加到选项窗格。所以你可以将你的列表(滚动窗格?)添加到对话框中。

JList list = new JList(...);
int value = JOptionPane.showOptionDialog(null, list, ...);

阅读How to Use Dialogs上的Swing教程中的部分。如果愿意,甚至可以阻止对话框关闭,直到从列表中选择了一个项目。