Как отключить изменение положения JSlider при щелчке правой кнопкой мыши - PullRequest
1 голос
/ 16 марта 2012

Я использую 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
        }

    }
});

Ответы [ 3 ]

4 голосов
/ 16 марта 2012

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

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

JDK1.6.0_31:

Идентификатор ошибки: 6614972 Значение JSlider не должно изменяться при щелчке правой кнопкой мыши

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);
  }
}
1 голос
/ 16 марта 2012

Другой подход к обходу ошибок в слушателях пользовательского интерфейса -

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

Небольшое преимущество по сравнению с подходом @ 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 голосов
/ 16 марта 2012

I В случае, если он не работает с 1.7 Сначала вы должны удалить все mouseListener из вашего слайдера

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

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

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

}

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

...