首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JList上的ListSelectionListener不工作

JList上的ListSelectionListener不工作
EN

Stack Overflow用户
提问于 2011-05-24 12:19:43
回答 1查看 8K关注 0票数 1

我在这个侦听器上遇到了问题,gui总体上构造和工作正常,jlist也在,但是当我选择列表中的一些项时,我看不到结果,也看不到我为测试目的编写的printl(),请注意,此代码包含在getJContentPane中,以便在初始化时添加事件处理程序。

代码语言:javascript
复制
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():

代码语言:javascript
复制
    private void doMyMethod(ListSelectionEvent e){

    if(e.getValueIsAdjusting()){


        return;

     }else{


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

         accounter.add(item);
     }

}

这是一个非常简单的方法,它接受ListSelectionEvent的一个实例作为参数。在我看来,主要的问题不是执行非常基本的操作的doMyMethod(),而是eventHandler根本没有触发的事实,似乎gui根本不“监听”这个列表。

有什么想法吗?

下面是初始化代码:

代码语言:javascript
复制
   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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-25 01:36:46

在试图理解你的问题中发生了什么之后,我了解到当选择发生变化时,你无法在列表中获得所选的项目。

为了向您展示如何实现这一点,我构建了以下示例。您可以在那里观察到if else的每个部分何时被调用。当您将鼠标拖到项目上时,if(e.getValueIsAdjusting())将始终执行。else部分在你释放鼠标的时候被调用,同时之前点击了一个项目。

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

1.永远不会调用doMyMethod()方法和其中的if(e.getValueIsAdjusting())代码片段,因为您已经在调用它之前检查了该条件。另外,没有必要编写一个处理侦听器事件的方法,这段代码应该留在侦听器内部,它是私有的。然后,如果你想以编程方式调用它的代码,你可以调用listener.valueChanged(evt)。

2. evt.getSource()返回的对象是事件的作者,在本例中是myList,而不是我认为您想要的选定项。为此,请直接使用源上的getSelectedValue()或myList,因为此侦听器只提供此列表。

代码语言:javascript
复制
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有所帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6105646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档