Search code examples
javaswingjslider

Deactivate default java JSlider mouse callbacks


How do you deactivate e.g. the mouseReleased event callback on a JSlider component?


Solution

  • You can override JSlider, with an enabled property. When adding a mouse listener, create a new mouse listener which delegates to the original, but only when the property is enabled:

    import javax.swing.JSlider;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    class MyJSlider extends JSlider
    {
        private boolean isEnabled = true;
    
        public void setEnabled(boolean isEnabled)
        {
            this.isEnabled = isEnabled;
        }
    
        @Override
        public synchronized void addMouseListener(final MouseListener delegate)
        {
            super.addMouseListener(
                new MouseListener() {
                    @Override
                    public void mouseClicked(final MouseEvent e) {
                        delegate.mouseClicked(e);
                    }
    
                    @Override
                    public void mousePressed(final MouseEvent e) {
                        delegate.mousePressed(e);
                    }
    
                    @Override
                    public void mouseReleased(final MouseEvent e) {
                        if (isEnabled) {
                            delegate.mouseReleased(e);
                        }
                    }
    
                    @Override
                    public void mouseEntered(final MouseEvent e) {
                        delegate.mouseEntered(e);
                    }
    
                    @Override
                    public void mouseExited(final MouseEvent e) {
                        delegate.mouseExited(e);
                    }
                }
            );
        }
    }