jsliderをクリックして値を移動または変更するのを止めることはできますか?私はjsliderがドラッグされたときにのみ移動するようにしたい。私はそれをクリックしても何もしたくない。 誰かがこれで私を助けてくれますか?クリックしてjsliderを移動させないようにする
答えて
残念ながら、かなりの量のテストの後、この問題を解決する方法やリスナーの組み合わせが見つかりませんでした。私はスライダーの値に対するすべての変更を無効にして得た最も近いが、関係なく、それがどのように変化しなかった。
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()
など)さえも防止します)。
私の前のコードには、スライダが「スライド」(実際のマウスドラッグで変更されている)かどうかをチェックしようとするマウスリスナーがいくつか含まれていましたが、後でスライダボタンからマウスを押したままドラッグすると、 。
努力に感謝します..これは私にどのように私はそれについて行くべきかについてのアイデアを与えると思います。 – user6866106
他のいくつかの例があります。
slider1
:常にfalse
を返すようにTrackListener#shouldScroll(...)
メソッドをオーバーライドします。slider2
:MouseEvent
を右ボタンとして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);
}
}
}
ありがとうございました。これは間違いなく私の問題を解決すると思います – user6866106
- 1. 右クリックを無視して、代わりにクリックを移動させよう
- 2. スクロール中に移動要素を移動させないようにする
- 3. ボタンを移動させないようにする方法
- 4. Zend Toolsがコントローラーファイルを移動させないようにする
- 5. 最初のクリックでスライドを移動させ、最初のクリックで左に動かないようにするにはどうすればよいですか?
- 6. ボタンのようなfacebookをクリックして別のURLに移動する
- 7. `gulp-uglify`がグローバル変数を移動させないようにするには?
- 8. オブジェクトが特定のオブジェクトを移動させないようにしますか?
- 9. 他のdivを移動させないようにテキストを停止する
- 10. ハイパーリンクをクリックすると、jqueryが動作し、ページが移動しないようにする - jquery
- 11. divsが他のdivを移動させないようにする方法
- 12. divをウィンドウ上で移動させないようにするサイズ変更
- 13. ユーザーがクリックしてクリックしたときにカーソルを移動するJavaScriptなし
- 14. F#のガベージコレクタによってオブジェクトが移動されないようにする
- 15. <select>オプションを[移動]ボタンをクリックしてリセットしないようにする方法
- 16. ExtJS6:クリック時にグリッド行がスクロールしてフォーカスに移動しないようにする方法
- 17. iframeにマウスを移動する(クリックしない)
- 18. ネイティブマップをクリックして別の画面に移動するにはピンをクリックしてください
- 19. 「index.html?」に移動します。ボタンをクリックしないでください。
- 20. ウェブページ上で何も移動しないようにしてください。
- 21. 2つのJSliderを同期させる
- 22. キャラクターをキャンバス上に移動するが画面上に移動させない
- 23. クリックして移動する画像ボックス
- 24. Windowsフォームウィンドウを移動するには、背景をクリックしてください
- 25. キーボードがUITableViewのテキストビューを移動しないようにする
- 26. インデックスが移動しないように配列をソートする?
- 27. クリックまたはキーを押したときに次のスライドに移動しないようにする
- 28. ItemTouchHelperドラッグしたアイテムをフラグメントフッタに移動させよう
- 29. テーブルをソートして1つのカラムを移動しないようにする
- 30. ウィンドウのサイズを変更してテキストを移動しないようにする
あなたはスライダーのつまみをクリックした場合は値を変更しないでください。 – FredK
@FredKはい、スライダー上の他の場所をクリックすると、クリックした場所に向かっていくつかのステップが描画されます。これは停止したいものです。 – user6866106
これはJSliderが動作する方法です。他の方法で仕事をしようとすると、あなたのユーザーを混乱させ、迷惑をかけることになります。 – FredK