2016-10-06 43 views
3

点击时是否可以阻止jslider移动或更改值?我想让我的jslider只在被拖动时才移动。当我点击它时,我不希望它做任何事情。 会有人请帮我这个。停止点击时移动jslider

+0

如果你点击滑块旋钮它不应该改变的价值。 – FredK

+0

@FredK是的,但如果您单击滑块上的任何其他位置,它会向您所点击的位置绘制一些步骤,这就是我想停止的位置 – user6866106

+1

这就是JSlider应该如何工作的方式。如果您尝试以其他方式开展工作,您将极大地混淆和惹恼您的任何用户。 – FredK

回答

0

不幸的是,经过相当数量的测试之后,我找不到任何可以解决此问题的方法或事件侦听器组合。我得到的是禁用所有修改滑块值最接近的,不管它是如何改变:

import javax.swing.JFrame; 
import javax.swing.JSlider; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class App { 
    public static void main(String[] args) { 
     final JFrame jframe = new JFrame("Demo"); 

     final JSlider jslider = new JSlider(); 

     // Limit user access 
     new SliderLocker(jslider).preventSlide = true; 

     jslider.setMajorTickSpacing(10); 
     jslider.setPaintTicks(true); 
     jframe.getContentPane().add(jslider); 

     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setSize(400, 400); 
     jframe.setResizable(false); 
     jframe.setVisible(true); 
    } 

    // Create custom event handler to restore to original value with event system 
    private static class SliderLocker implements ChangeListener { 
     public boolean preventSlide = false; 
     private int oldVal; 
     private final JSlider comp; 

     public SliderLocker(JSlider c){ 
      comp = c; 
      oldVal = c.getValue(); 

      c.addChangeListener(this); 
     } 

     @Override 
     public void stateChanged(ChangeEvent ev){ 
      if(preventSlide){ 
       comp.setValue(oldVal); 
      } 
     } 
    } 
} 

基本上它创建一个新SliderLocker具有公共标志.preventSlide。当设置为true时,它将阻止所有用户交互(甚至是代码触发的交互,例如.setValue())。

我以前的代码已经包含了一些鼠标侦听器,它们将尝试检查滑块是否被“滑动”(通过实际的鼠标拖动来更改),但后来我发现按住滑块按钮并拖动鼠标会中断处理程序。

+0

谢谢你的努力..我想这给了我一个想法,我应该如何去做。 – user6866106

1

还有一些其他的例子:

  • slider1:覆盖TrackListener#shouldScroll(...)方法总是返回false
  • slider2:使用JLayer将鼠标左键改为MouseEvent作为右键。
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.plaf.*; 
import javax.swing.plaf.metal.MetalSliderUI; 

public class MainPanel { 
    public JComponent makeUI() { 
    JSlider slider0 = new JSlider(); 

    JSlider slider1 = new JSlider() { 
     @Override public void updateUI() { 
     super.updateUI(); 
     setUI(new MetalSliderUI() { 
      @Override protected TrackListener createTrackListener(JSlider slider) { 
      return new TrackListener() { 
       @Override public boolean shouldScroll(int direction) { 
       return false; 
       } 
      }; 
      } 
     }); 
     } 
    }; 

    //http://stackoverflow.com/questions/9736237/how-to-disable-position-change-of-jslider-on-mouse-right-click 
    UIManager.put("Slider.onlyLeftMouseButtonDrag", false); 
    JSlider slider2 = new JSlider(); 

    Box box = Box.createVerticalBox(); 
    box.setBorder(BorderFactory.createEmptyBorder(20, 0, 20, 20)); 
    box.add(makeTitledPanel("Default", slider0)); 
    box.add(Box.createVerticalStrut(20)); 
    box.add(makeTitledPanel(
     "Override TrackListener#shouldScroll(...): false", slider1)); 
    box.add(Box.createVerticalStrut(20)); 
    box.add(makeTitledPanel(
     "JLayer + Slider.onlyLeftMouseButtonDrag: false", 
     new JLayer<JSlider>(slider2, new DisableLeftPressedLayerUI()))); 
    box.add(Box.createVerticalGlue()); 

    return box; 
    } 
    private static JComponent makeTitledPanel(String title, JComponent c) { 
    JPanel p = new JPanel(new BorderLayout()); 
    p.setBorder(BorderFactory.createTitledBorder(title)); 
    p.add(c, BorderLayout.NORTH); 
    return p; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new MainPanel().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 

class DisableLeftPressedLayerUI extends LayerUI<JSlider> { 
    @Override public void installUI(JComponent c) { 
    super.installUI(c); 
    if (c instanceof JLayer) { 
     ((JLayer) c).setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK); 
    } 
    } 
    @Override public void uninstallUI(JComponent c) { 
    if (c instanceof JLayer) { 
     ((JLayer) c).setLayerEventMask(0); 
    } 
    super.uninstallUI(c); 
    } 
    @Override protected void processMouseEvent(MouseEvent e, JLayer<? extends JSlider> l) { 
    if (e.getID() == MouseEvent.MOUSE_PRESSED && SwingUtilities.isLeftMouseButton(e)) { 
     JSlider slider = (JSlider) e.getComponent(); 
     MouseEvent me = new MouseEvent(
     slider, 
     e.getID(), e.getWhen(), 
     InputEvent.BUTTON3_DOWN_MASK, //e.getModifiers(), 
     e.getX(), e.getY(), 
     e.getXOnScreen(), e.getYOnScreen(), 
     e.getClickCount(), 
     e.isPopupTrigger(), 
     MouseEvent.BUTTON3); //e.getButton()); 
     e.consume(); 
     slider.dispatchEvent(me); 
    } 
    } 
} 
+0

非常感谢你..我认为这一定会解决我的问题 – user6866106