JList中添加了ListSelectionListener,每次打印出当前所选的索引,可是为什么每次鼠标点击后会ListSelectionListener会响应两次?我一开始以为是先将当前所选项置为空,然后将当前所选项置为目标值,但是从打印结果来看,centerList.getSelectedIndex()并未返回-1import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Test extends JFrame
{
JList centerList = new JList();
public Test()
{
String[] s = {"a", "b", "c"};
centerList.setListData(s);
centerList.addListSelectionListener(new ListSelectionListener()
{
  public void valueChanged(ListSelectionEvent e)
  {
      System.out.println(centerList.getSelectedIndex());
  }
});

add(centerList);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(400, 400));
pack();
setVisible(true);
}

public static void main(String[] args)
{
new Test();
}
}

解决方案 »

  1.   

    这样的话,你要是只打执行一次打印协作。
    下面可以。import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.event.MouseEvent;public class JFrameDemo extends JFrame
    {
        JList centerList = new JList();
        boolean flag = false; //鼠标是否按下的标志
        public JFrameDemo()
        {
            String[] s = {"a", "b", "c"};
            centerList.setListData(s);
            centerList.addListSelectionListener(new ListSelectionListener()
            {
              public void valueChanged(ListSelectionEvent e)
              {
               if(flag == true) {//仅当鼠标按下时执行打印动作
                System.out.println(centerList.getSelectedIndex());
                flag = false;
               }
              }
            });
            
            centerList.addMouseListener(new MouseAdapter() {
             public void mousePressed (MouseEvent e) {
             flag = true;
             }
            });
            
            add(centerList);
            
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setPreferredSize(new Dimension(400, 400));
            pack();
            setVisible(true);
        }
        
        public static void main(String[] args)
        {
            new JFrameDemo();
        }
    }