2016-10-06 4 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); 
      } 
     } 
    } 
} 

は、基本的には、公開フラグ.preventSlideを持つ新しいSliderLockerを作成します。 trueに設定すると、すべてのユーザーのやりとり(コードで起動される対話(例:.setValue()など)さ​​えも防止します)。

私の前のコードには、スライダが「スライド」(実際のマウスドラッグで変更されている)かどうかをチェックしようとするマウスリスナーがいくつか含まれていましたが、後でスライダボタンからマウスを押したままドラッグすると、 。

+0

努力に感謝します..これは私にどのように私はそれについて行くべきかについてのアイデアを与えると思います。 – user6866106

1

他のいくつかの例があります。

  • slider1:常にfalseを返すようにTrackListener#shouldScroll(...)メソッドをオーバーライドします。
  • slider2MouseEventを右ボタンとしてJLayerを押して変更します。
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

関連する問題