Search code examples
javaswingjsliderchangelistener

ChangeListener is not firing


I'm learning about change listeners and would like to find out why a part of my coding is not making a change listener fire when the user moves a slider.

Here is the listener. Everything is in the same method:

ChangeListener lst = new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
        showDate();
    }
};

Here is some code that adds the listener:

m_slDay = new JSlider(JSlider.HORIZONTAL, 1, maxDays,
    m_calendar.get(Calendar.DAY_OF_MONTH));
m_slDay.setPaintLabels(true);
m_slDay.setMajorTickSpacing(5);
m_slDay.setMinorTickSpacing(1);
m_slDay.setPaintTicks(true);

// This line of code seems to work.  
m_slDay.addChangeListener(lst);

p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(), "Day"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(RIGID_DIMENSION));
p.add(m_slDay);
p.add(Box.createRigidArea(RIGID_DIMENSION));
p1.add(p);

This code is based on the above chunk of code but nothing happens when the user moves the slider:

m_slDayOfWeek = new JSlider(JSlider.HORIZONTAL, 1, maxDaysOfTheWeek,
    m_calendar.get(Calendar.DAY_OF_WEEK));
m_slDayOfWeek.setPaintLabels(true);
m_slDayOfWeek.setMajorTickSpacing(1);
m_slDayOfWeek.setMinorTickSpacing(1);
m_slDayOfWeek.setPaintTicks(true);

// This one is not working and I'm not sure why it's happening.
m_slDayOfWeek.addChangeListener(lst);

p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(), "Day of Week"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(RIGID_DIMENSION));
p.add(m_slDayOfWeek);
p.add(Box.createRigidArea(RIGID_DIMENSION));
p1.add(p);

Solution

  • Seems like there is something wrong in your code part, as pointed out in comments in your showDate() method, this thing works flawlessly in this code :

    import javax.swing.*;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    public class SliderChangeEffect extends JFrame
    {
        private JSlider slider;
        private int count = 0;
        private ChangeListener changeListener = new ChangeListener()
        {
            public void stateChanged(ChangeEvent ce)
            {
                System.out.println(count++);
            }
        };
    
        private void createAndDisplayGUI()
        {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationByPlatform(true);
    
            JPanel contentPane = new JPanel();
            contentPane.setOpaque(true);
    
            slider = new JSlider(0, 10, 5);
            slider.setMajorTickSpacing(2);
            slider.setMinorTickSpacing(1);
            slider.addChangeListener(changeListener);
    
            contentPane.add(slider);
    
            getContentPane().add(contentPane);
            pack();
            setVisible(true);
        }
    
        public static void main(String... args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    new SliderChangeEffect().createAndDisplayGUI();
                }
            });
        }
    }