2016-10-06 47 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