JSlider - нажатие заставляет точку двигаться в этом направлении - PullRequest
1 голос
/ 17 августа 2011

У меня есть JSlider с минимальным значением 0 и максимальным значением 100. Когда JSlider запускается впервые, значение равно 0.

Теперь, когда я щелкаю мышью по 50 или даже по 20или 100, JSlider не перемещается в то место, где я нажимаю.Он просто немного подпрыгивает вправо.

Как мне сделать так, чтобы значение соответствовало тому, что я нажимал?

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

Вот начало класса, который будет делать то, что вам нужно.

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

// 'E' stands for enhanced
public class EJSlider extends JSlider {

   public EJSlider() {
      super();
      addMouseListener(new MouseAdapter() {
         @Override
         public void mousePressed(MouseEvent e) {
            Point p = e.getPoint();
            double percent = p.x / ((double) getWidth());
            int range = getMaximum() - getMinimum();
            double newVal = range * percent;
            int result = (int)(getMinimum() + newVal);
            setValue(result);
         }
      });
   }

   public static void main(String[] args) {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.add(new EJSlider());
      f.pack();
      f.setVisible(true);
   }
}

Просто запустите пример.Слайдер будет перемещаться туда, куда вы щелкаете мышью.Это не было тщательно протестировано и пока не будет работать с вертикальными ползунками.

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

(Обратите внимание, я знаю, что это еще не идеально, но это хорошее начало.)

1 голос
/ 07 августа 2018

BasicSliderUI предоставляет метод с именем valueForXPosition :

Возвращает значение в позиции x.Если xPos находится за пределами дорожки слева или справа, этот метод устанавливает значение минимального или максимального значения ползунка в зависимости от того, перевернут ползунок или нет.

(Длявертикальные ползунки используют valueForYPosition )

Пример добавления MouseListener к горизонтальному JSlider с использованием valueForXPosition:

JSlider slider = new JSlider();
slider.setOrientation(JSlider.HORIZONTAL);
slider.setMinimum(0);
slider.setMaximum(100); 
slider.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
       JSlider sourceSlider=(JSlider)e.getSource();
       BasicSliderUI ui = (BasicSliderUI)sourceSlider.getUI();
       int value = ui.valueForXPosition( e.getX() );
       slider.setValue(value);
    }
});
...