Vector<String> totalProducts = Products.getProductNames();
Vector<String> selectedProducts = Products.getSelectedProductNames();
selectedProducts 向量是 totalProducts 的子向量(意味着 selectedProducts 包含 totalProducts中的一个,多个或所有元素)。我想要的是组合这两个向量并制作一个 JList ,其中包含totalProducts中的所有元素,以及已选择选择的selectedProducts元素。
我尝试了什么:
Vector<Integer> indices = new Vector<Integer>();
JList prdList = new JList(totalProducts);
for(int i = 0; i < totalProducts.size(); i++)
{
for(String name : selectedProducts)
{
if(totalProducts.contains(name)) indices.add(i);
}
}
Object [] objIndices = indices.toArray();
//... Cast from Object [] to int [] ....
prdList.setSelectedIndices(intIndices);
...但是这会选择最终JList中的所有元素。
以前我试过:
JList prdList = new JList(totalProducts);
for(String tName : totalProducts)
{
for(String sName : selectedProducts)
{
if(totalProducts.contains(sName)) prdList.setSelectedValue(sName, false);
}
}
...但是这个只选择了selectedProducts中的最后一个元素。
你能帮我做好吗?
答案 0 :(得分:1)
在调试你的第一次尝试时(看起来它应该工作,你的intIndices数组的内容是什么?因为它看起来应该有效,假设你的数组转换有效。
但是,由于保证selectedproducts
项目的总数少于总数,因此您可能希望迭代它而不是?
List<Integer> indices = new ArrayList<Integer>(selectedProducts.size());
for(String name : selectedProducts)
{
int index = totalProducts.indexOf(name);
if (index != -1)
indices.add(index);
}
虽然,因为indexOf
是一个列表的线性搜索,所以它可能无论如何都没有太大的区别。
对于您的第二次尝试,ListSelectionModel具有添加所选索引(addSelectionInterval(int index0, int index1)
)的方法
,你正在使用设置(覆盖)选择的那个。
请参阅http://download.oracle.com/javase/6/docs/api/javax/swing/ListSelectionModel.html
除此之外:您可能希望使用List<>
而不是Vector<>
,因为向量会有很多不必要的同步开销。除非你需要同步....
编辑固定复制+粘贴add(i)with add(index)
答案 1 :(得分:1)
您选择所有项目的尝试是这样做的,因为您正在迭代每个项目,并且如果来自selectedProducts列表的任何项目在总列表中,则将迭代项目的索引添加到最终选择中名单。尝试将循环更改为以下内容:
for(int i = 0; i < totalProducts.size(); i++)
{
String name = totalProducts.get(i);
if(selectedProducts.contains(name)) indices.add(i);
}