點擊時是否可以阻止jslider移動或更改值?我想讓我的jslider只在被拖動時才移動。當我點擊它時,我不希望它做任何事情。 會有人請幫我這個。停止點擊時移動jslider
3
A
回答
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
相關問題
- 1. 停止滑動點擊鏈接時
- 2. 停止動畫點擊
- 3. 點擊jQuery停止動畫
- 4. 停止錨滾動點擊
- 5. 讓JSlider欄移動鼠標點擊事件
- 6. 停止導航移動時懸停
- 7. 停止移動球在按鈕上點擊
- 8. 如何停止鼠標移動事件點擊窗外的
- 9. 按鈕點擊後停止動畫
- 10. 在SKSpriteKit上停止衝動點擊
- 11. PHP自動點擊捕捉/停止
- 12. 移動設備interperting懸停爲點擊
- 13. 當我點擊div時停止功能
- 14. 當Flowplayer點擊時如何停止AnythingSlider
- 15. Python&PyGTK:在點擊按鈕時停止
- 16. 停止選擇鏈接被點擊時
- 17. 當點擊段時停止cellForRowAtIndexPath
- 18. setTimeinterval停止時,右鍵點擊
- 19. 定時器不停止按鈕點擊
- 20. 當圖片點擊時,視頻停止
- 21. 如何讓定時器停止點擊
- 22. SDL移動停止
- 23. SCNPhysicsBody停止移動
- 24. 使用JSlider移動JScrollPanel?
- 25. jQuery的動畫上點擊,停止對重複多次點擊
- 26. 網頁地圖 - 懸停/點擊/點擊移動freindliness
- 27. 點擊關聯標籤(HtmlFor)時,停止點擊事件
- 28. 停止按鈕點擊?
- 29. 停止點擊圖層
- 30. JQuery停止點擊按鈕
如果你點擊滑塊旋鈕它不應該改變的價值。 – FredK
@FredK是的,但如果您單擊滑塊上的任何其他位置,它會向您所點擊的位置繪製一些步驟,這就是我想停止的位置 – user6866106
這就是JSlider應該如何工作的方式。如果您嘗試以其他方式開展工作,您將極大地混淆和惹惱您的任何用戶。 – FredK