JList上的ListSelectionListener无法正常工作

JBo*_*Boy 1 java swing jlist

我有这个监听器的问题,gui一般构造和工作正常,jlist也在那里,但当我选择列表中的一些项目时,我没有看到结果,也没有我为测试目的写的printl(),请注意,此代码包含在getJContentPane中,以便在init-time添加事件处理程序

private JList myList=new JList(dlm);//a defaultlistmodel 
myList.addListSelectionListener(new ListSelectionListener() {
              public void valueChanged(ListSelectionEvent evt) {
                if (evt.getValueIsAdjusting()){
                    System.out.println("Eventhandler called");
                  return;
                }
                System.out.println("Eventhandler called");
                doMyMethod(evt);
              }
            });
Run Code Online (Sandbox Code Playgroud)

doMyMethod():

    private void doMyMethod(ListSelectionEvent e){

    if(e.getValueIsAdjusting()){


        return;

     }else{


         String item=(String)e.getSource();

         accounter.add(item);
     }

}
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的方法,它将ListSelectionEvent的一个实例作为参数.我认为的主要问题不是doMyMethod()执行非常基本的操作,但事实上eventHandler根本没有被触发,似乎gui没有"听"这个清单

任何的想法?

这里的初始化代码:

   private JScrollPane getScrollBox() {
    if (scrollboxBox == null) {
        scrollboxBox = new JScrollPane();
        scrollBox.setBounds(new Rectangle(280, 56, 245, 204));
        scrollBox.getViewport().add(myList,null);

        myList.addListSelectionListener(new ListSelectionListener() {

              public void valueChanged(ListSelectionEvent evt) {
                  System.out.println("addListSelectionListener");
                if (evt.getValueIsAdjusting()){
                    System.out.println("Eventhandler called");
                  return;
                }
                System.out.println("Eventhandler called");
                doMyMethod(evt);
              }
            });


    }
    return scrollboxBox;
}
Run Code Online (Sandbox Code Playgroud)

Bor*_*oro 5

在尝试了解您的问题中发生的事情之后,我了解到,当选择更改时,您未能在列表中获得所选项目.

为了向您展示如何实现这一点,我已经构建了以下示例.你可以在那里调用if else的每个部分.在if(e.getValueIsAdjusting())当你拖过项目moue总是执行.在先前单击某个项目时释放鼠标时会调用else部分.

您提供的代码中存在一些严重问题,因此我尝试删除所有不必要的代码,例如

1. 由于您在调用之前已经检查了该条件,因此永远不会调用其中的doMyMethod()方法和if(e.getValueIsAdjusting())代码段.此外,无需编写处理侦听器事件的方法,此代码应保留在私有侦听器内.然后,如果您想以编程方式调用其代码,您将调用listener.valueChanged(evt).

2. evt.getSource()返回作为事件作者的对象,在这种情况下myList不是我认为你所选择的项目,因为这个使用getSelectedValue()了源或myList,因为这个监听器只服务于这个列表.

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ListTest extends JPanel
{
    private JScrollPane myScrollPane;
    private JList myList;
    private ListSelectionListener lSL = new ListSelectionListener()
    {
        @Override
        public void valueChanged(ListSelectionEvent evt)
        {
            if(evt.getValueIsAdjusting())
            {
                System.out.println("Eventhandler called evt.getValueIsAdjusting() true");
                return;
            }
            else
            {
//              String item = (String) evt.getSource();//!!!Exception casting JList to String
                //maybe what you need is getSelectedValue()
                System.out.println("else called myList.getSelectedValue() ="+myList.getSelectedValue());
            }
        }
    };

    private ListTest()
    {
        int noRows = 25;
        Object[] listData = new String[noRows];
        for(int i =0; i < noRows; i++)
            listData[i]= "Oi "+i;
        this.myList = new JList(listData);
        this.myScrollPane = new JScrollPane(myList);
        myList.addListSelectionListener(lSL);
        add(myScrollPane);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {               
                ListTest p = new ListTest();
                JPanel contentPane = new JPanel();
                contentPane.add(p);
                JFrame f = new JFrame();
                f.setContentPane(contentPane);
                f.setSize(800, 600);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

希望即使它不能解决你的问题,它至少会对我们建立一个SSCCE有所帮助.