微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JList上的ListSelectionListener不起作用

如何解决JList上的ListSelectionListener不起作用

| 我在使用此侦听器时遇到问题,GUI的一般构造和工作正常,jlist也在那里,但是当我在列表中选择某些项时,我看不到结果,也看不到我出于测试目的而编写的printl() ,请注意此代码包含在getJContentPane中,以便在初始化时添加事件处理程序
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);
              }
            });
doMyMethod():
    private void doMyMethod(ListSelectionEvent e){

    if(e.getValueIsAdjusting()){


        return;

     }else{


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

         accounter.add(item);
     }

}
这是一个非常简单的方法,它以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;
}
    

解决方法

尝试了解您的问题后,我了解到更改选择后,您无法在列表中获得所选项目。 为了向您展示如何实现此目标,我构建了以下示例。您可以在那里观察if else的每个部分。当将moue拖到项目上方时,始终执行
if(e.getValueIsAdjusting())
。在先前单击某个项目的同时释放鼠标时,将调用else部分。 您提供的代码中存在一些严重问题,因此我尝试删除了所有不必要的内容,例如 1.
doMyMethod()
方法和其中的
if(e.getValueIsAdjusting())
代码段将永远不会被调用,因为您已经在调用该条件之前检查了该条件。此外,无需编写处理侦听器事件的方法,此代码应保留在私有侦听器内。然后,如果要以编程方式调用其代码,则可以调用listener.valueChanged(evt)。 2.
evt.getSource()
返回事件的作者,在这种情况下,my是myList而不是我认为您选择的所选项目,为此,请直接在源或myList上使用
getSelectedValue()
,因为此侦听器仅提供此列表。
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);
            }
        });
    }
}
希望即使它不能解决您的问题,至少也将对我们建立SSCCE有帮助。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。