点击时是否可以阻止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