JSlider:在拖动过程中无法使旋钮在最接近的刻度上移动(JSlider : can't make the knob move on the closest tick during dra

系统教程 行业动态 更新时间:2024-06-14 16:55:57
JSlider:在拖动过程中无法使旋钮在最接近的刻度上移动(JSlider : can't make the knob move on the closest tick during drag)

正如标题中所解释的那样,我制作了一个简单的JSlider,并且我成功地设置了最小值和最大值以及次要的刻度间距,然后我将“setSnapToTicks”设置为true。 这部分没有问题,当用户释放鼠标时,我的旋钮在最接近的刻度上移动,它不会更容易。

但是现在我想在不释放鼠标的情况下获得这种效果,旋钮必须通过滴答滴答滴答而不必关注这些滴答滴答之间的值,我希望它仅在滴答值上“跳跃”。 我只是做了很多搜索,但我没有找到答案,我只是想知道“setExtent”,它应该设置我正在寻找的那一步,但在一些调试后它不起作用。 这里是我对JSlider的简单声明:

sliderFlightLevel = new JSlider(); sliderFlightLevel.setValue(100); sliderFlightLevel.setMinorTickSpacing(100); sliderFlightLevel.setMinimum(100); sliderFlightLevel.setMaximum(50000); GridBagConstraints gbcSliderFlightLevel = new GridBagConstraints(); gbcSliderFlightLevel.gridwidth = 3; gbcSliderFlightLevel.insets = new Insets(0, 10, 5, 10); gbcSliderFlightLevel.fill = GridBagConstraints.HORIZONTAL; gbcSliderFlightLevel.gridx = 0; gbcSliderFlightLevel.gridy = 1; mainPanel.add(sliderFlightLevel, gbcSliderFlightLevel);

感谢阅读,我希望我会得到一些帮助:)

As explained in the title, i made a simple JSlider, and i successfully setted a minimum and maximum value, and a minor tick spacing, then i setted the "setSnapToTicks" to true. No problem with that part, my knob move on the closest tick when the user release the mouse, it can't be easier.

But now i want to get this effect without release the mouse, the knob have to move tick by tick without paying any attention on the values between those ticks, i want it to "jump" only on ticks values. I just made many searches, and i didn't find the answer, i just eard about "setExtent", which is supposed to set the sort of step i'm searching for, but it didn't work after some debugging. Here is my simple declaration of the JSlider :

sliderFlightLevel = new JSlider(); sliderFlightLevel.setValue(100); sliderFlightLevel.setMinorTickSpacing(100); sliderFlightLevel.setMinimum(100); sliderFlightLevel.setMaximum(50000); GridBagConstraints gbcSliderFlightLevel = new GridBagConstraints(); gbcSliderFlightLevel.gridwidth = 3; gbcSliderFlightLevel.insets = new Insets(0, 10, 5, 10); gbcSliderFlightLevel.fill = GridBagConstraints.HORIZONTAL; gbcSliderFlightLevel.gridx = 0; gbcSliderFlightLevel.gridy = 1; mainPanel.add(sliderFlightLevel, gbcSliderFlightLevel);

Thanks for reading, i hope i'll get some help :)

最满意答案

我认为这个行为是由组件的UI委托( SliderUI )控制的。 你可以尝试另一种外观和感觉,或者你可以尝试配置你使用的那个。

你也可以在你的组件上安装另一个UI委托。

看到这个自定义摆动组件的行为的真实世界的例子 。

编辑

我想出了一个丑陋的黑客来完成这项工作。 此代码完全依赖于BasicSliderUI类的实现细节(大多数外观使用该代码)。

import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.JSlider; import javax.swing.plaf.metal.MetalSliderUI; public class MetalSnapSliderUI extends MetalSliderUI { private MouseMotionListener myMouseMotionListener = new MouseMotionListener() { public void mouseDragged(MouseEvent e) { trackListener.mouseDragged(e); calculateThumbLocation(); slider.repaint(); } public void mouseMoved(MouseEvent e) { trackListener.mouseMoved(e); } }; @Override protected void installListeners(JSlider slider) { super.installListeners(slider); slider.removeMouseMotionListener(trackListener); slider.addMouseMotionListener(myMouseMotionListener); } @Override protected void uninstallListeners(JSlider slider) { super.uninstallListeners(slider); slider.removeMouseMotionListener(myMouseMotionListener); } }

您将需要在JSlider上安装此UI:

JSlider s = new JSlider(); s.setUI(new MetalSnapSliderUI());

I think this behavior is controlled by the UI delegate of the component (SliderUI). You can try another look & feel, or you can try to configure the one you use.

You can also install another UI delegate on your component.

See this real world example of customizing the behavior of a swing component.

Edit

I came up with a ugly hack that does the job. This code is completely dependant on the implementation details of the class BasicSliderUI (which is used by most look & feels).

import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.JSlider; import javax.swing.plaf.metal.MetalSliderUI; public class MetalSnapSliderUI extends MetalSliderUI { private MouseMotionListener myMouseMotionListener = new MouseMotionListener() { public void mouseDragged(MouseEvent e) { trackListener.mouseDragged(e); calculateThumbLocation(); slider.repaint(); } public void mouseMoved(MouseEvent e) { trackListener.mouseMoved(e); } }; @Override protected void installListeners(JSlider slider) { super.installListeners(slider); slider.removeMouseMotionListener(trackListener); slider.addMouseMotionListener(myMouseMotionListener); } @Override protected void uninstallListeners(JSlider slider) { super.uninstallListeners(slider); slider.removeMouseMotionListener(myMouseMotionListener); } }

You will need to install this UI on the JSlider :

JSlider s = new JSlider(); s.setUI(new MetalSnapSliderUI());

更多推荐

本文发布于:2023-04-10 11:20:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/dzcp/0517ea2cbcdae5ceb3ba4df2d10b0cb8.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:旋钮   刻度   拖动   过程中   最接近

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!