我需要一个静态实用工具方法来从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想要的任何默认值。
答案 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教程中的部分。如果愿意,甚至可以阻止对话框关闭,直到从列表中选择了一个项目。