2012-03-16 4 views
1

Я использую JSlider в своем приложении. Я хочу только левый клик, чтобы сместить JSlider, и я хочу отключить правый щелчок для JSlider. Я могу получить событие по правому клику, но слайдер меняет свое значение на другую позицию.Как отключить изменение позиции JSlider на мыши правой кнопкой мыши

jSlider.addChangeListener(new ChangeListener() { 

    public void stateChanged(ChangeEvent e) { 
     //code 
    } 
}); 

jSlider.addMouseListener(new MouseAdapter() { 

    public void mouseReleased(MouseEvent e) { 

     if (e.getButton() == java.awt.event.MouseEvent.BUTTON3) { 
      //code 
     } else { 
      //code 
     } 

    } 
}); 

ответ

4

Я использую JDK1.7.0_03, Windows 7

UIManager.put("Slider.onlyLeftMouseButtonDrag", Boolean.TRUE); 

JDK1.6.0_31:

Bug ID: 6614972 JSlider value should not change on right-click

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.plaf.metal.MetalSliderUI; 

public class SliderOnlyLeftMouseButtonDragTest { 
    public JComponent makeUI() { 
    JSlider slider00 = new JSlider(0,10,5); 
    JSlider slider01 = new JSlider(0,10,5); 
    slider01.setUI(new MetalSliderUI() { 
     protected TrackListener createTrackListener(JSlider slider) { 
     return new TrackListener() { 
      @Override public void mousePressed(MouseEvent e) { 
      if(!SwingUtilities.isLeftMouseButton(e)) { 
       return; 
      } 
      super.mousePressed(e); 
      } 
     }; 
     } 
    }); 
    JPanel p = new JPanel(); 
    p.add(slider00); 
    p.add(slider01); 
    return p; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new SliderOnlyLeftMouseButtonDragTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
+0

визуализации, что +1 – mKorbel

+0

Thaks, но это существующие приложения и я с помощью JAVA 6. У нас есть решение в Java 6 ..? – ajkush

+0

Это работает. спасибо – ajkush

0

I Случай он не работает с 1.7 Сначала вы должны удалить все мыши с помощью слайдера

for (MouseListener ml : slider.getMouseListeners()){ 
    slider.removeMouseListener(ml); 
} 

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

public void mouseReleased(MouseEvent e) { 

    if (e.getButton() == java.awt.event.MouseEvent.BUTTON3) { 
     //code whatever should happen on right click 
    } else { 
     e.getX()*slider.getMaximum()/slider.getWidth(); 
    } 

} 

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

+0

Да, я понимаю, но проблема заключается в том, что JSlider вызывает событие stateChanged перед событием mouseReleased и меняет его положение. Так что я хочу отключить правый щелчок на JSlider перед mouseReleased. – ajkush

+0

Вы уверены, что удалили все MouseListeners, прежде чем добавляли свои? – Vossi

1

Другой подход к работе с ошибками в Ui слушателей к

  • найти слушатель
  • реализовать обертку, который делегирует оригинал только в случае необходимости (здесь: не для правой кнопки)
  • повторно переместить оригинал и добавить обертку

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

в коде что-то вроде:

MouseListener[] listeners = slider.getMouseListeners(); 
MouseListener uiListener = null; 
for (MouseListener l : listeners) { 
    LOG.info(l.getClass().getName()); 
    if (l.getClass().getName().contains("Track")) { 
     uiListener = l; 
     break; 
    } 
} 

final MouseListener delegate = uiListener; 
MouseListener wrapper = new MouseListener() { 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     if (filter(e)) return; 
     delegate.mouseClicked(e); 
    } 

    private boolean filter(MouseEvent e) { 
     return SwingUtilities.isRightMouseButton(e); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     if (filter(e)) return; 
     delegate.mousePressed(e); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     if (filter(e)) return; 
     delegate.mouseReleased(e); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     delegate.mouseEntered(e); 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     delegate.mouseExited(e); 
    } 

}; 
slider.removeMouseListener(uiListener); 
slider.addMouseListener(wrapper); 
+0

+1 очень интересно – aterai