【问题标题】:ListSelectionListener on JList not workingJList 上的 ListSelectionListener 不起作用
【发布时间】:2017-08-29 15:04:55
【问题描述】:

我遇到了这个监听器的问题,一般的 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;
}

【问题讨论】:

  • 尝试递归是怎么回事?
  • 没注意到递归方法,现在改了: synoniemenList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { if (evt.getValueIsAdjusting()){ System.out.println( "事件处理程序调用"); return; } System.out.println("事件处理程序调用"); do(evt); } });
  • @JBoy,请使用新代码编辑您的问题。
  • 不确定我是否理解您的初始化代码的逻辑。如果内容窗格为空,则将侦听器添加到列表中,否则不添加。适当的 SSCCE (sscce.org) 会更有帮助。
  • @JBoy 现在它甚至无法编译。您曾经使用过scrollboxBox,后来又使用了一行scrollBox(除非您定义了这两个字段,但代码没有意义)。我再次建议您提供 SSCCE。

标签: java swing jlist


【解决方案1】:

在尝试了解您的问题发生了什么之后,我了解到您在更改选择时未能在列表中获得选定的项目。

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

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

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

2.evt.getSource() 返回作为事件作者的对象,在这种情况下,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

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 2011-04-18
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2018-12-28
    • 2012-05-10
    相关资源
    最近更新 更多