ListSelectionListener на JList не работает - PullRequest
1 голос
/ 24 мая 2011

У меня проблемы с этим слушателем, графический интерфейс в целом создается и работает нормально, также есть 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 вообще не запускается, похоже, графический интерфейс вообще не «слушает» этот список

Есть идеи?

здесь код инициализации:

   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;
}

1 Ответ

5 голосов
/ 24 мая 2011

После попытки понять, что происходит в вашем вопросе, я понял, что вы не можете получить выбранный элемент в списке, когда выбор изменяется.

Чтобы представить вам, как этого можно достичь, я построил приведенный ниже пример. Вы можете наблюдать там, когда вызывается каждая часть if else. if(e.getValueIsAdjusting()) выполняется всегда, когда вы перетаскиваете мышью на элементы. Другая часть вызывается, когда вы отпускаете мышь, когда вы предварительно щелкнули по элементу.

В предоставленном вами коде есть серьезные проблемы, поэтому я попытался удалить все ненужное, например,

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);
            }
        });
    }
}

Надеюсь, что даже если это не решит вашу проблему, по крайней мере, это поможет нам построить SSCCE .

...