2016-11-11 98 views
0

我有一个JList由什么最初是ArrayList<SomeClass>填充,我转换为一个数组。然后将JList包装在JScrollPane中并显示在JFrame上。当我在其中选择一个项目时,所选的第一个项目是正确的,但之后似乎选择了前一个项目。所以如果我有一个ArrayList<String>填充的“数字0”,“数字1”,“数字2”等,我按照顺序选择19,18,17,输出就好像我选择了19,19,18 :从选择19JList actionlistener选择项目中的“延迟”

import java.awt.Dimension; 
import javax.swing.*; 
import java.util.*; 
import javax.swing.event.*; 

public class DemoFrame extends JFrame implements ListSelectionListener{ 
    ArrayList<String> strings; 
    public DemoFrame(){ 
     strings = new ArrayList(); 
     for (int i=0; i<20; i++){ 
      strings.add("Number " + i); 
     } 
     JList demoList = new JList(); 
     demoList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     demoList.setVisibleRowCount(10); 
     JScrollPane listScroller = new JScrollPane(demoList); 
     listScroller.setPreferredSize(new Dimension(250, 500)); 
     demoList.setListData(strings.toArray()); 
     this.add(listScroller); 
     demoList.addListSelectionListener(this); 
     getContentPane().add(listScroller); 
     pack(); 
     setVisible(true); 
    } 

    @Override 
    public void valueChanged(ListSelectionEvent lse) { 
     if (!lse.getValueIsAdjusting()){ 
      System.out.println(lse.getLastIndex()); 
      System.out.println(strings.get(lse.getLastIndex())); 
     } 
    } 
} 

public class SODemo{ 
    public static void main(String[] args) { 
     DemoFrame demo = new DemoFrame(); 
    } 
} 

输出,18 17:

运行:19号19号19 19 18 18号

然而,从选择0,1,2输出:

运行:0 0号1号1 2 2号

为什么表现这样的吗?

回答

1

里有ListSelectionEvent类感兴趣2种方法:

公众诠释getFirstIndex()

返回的第一行,其选择可能已经改变的指标。

公众诠释getLastIndex()

返回的最后一排,其选择可能已经改变的指标。

所以选择事件实际上涉及到2组列表中的元素,将一个获得焦点和一个失去焦点

+0

我不是100%肯定我明白你在这里。我是否正确地读到你,你说的是因为选择已经改变(即它已被取消选择),听众返回“19”?如果是这样的话,我该如何克服它? – MrB

+0

@MrB如果调用getLastIndex(),它将返回给定ListSelectionEvent中涉及的列表模型中具有最高索引的元素。如果你从一个较高的索引转到较低的索引,那么这个将永远是你取消选择的元素。你应该做的是通过调用你的JList实例的getSelectedValue()来打印当前选定的项目(与选择事件本身无关)。 –

+0

你是明星。谢谢 – MrB