5

如标题所述,我制作了一个简单的 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);

感谢阅读,希望能得到帮助:)

4

1 回答 1

1

我认为这种行为是由组件(SliderUI)的 UI 委托控制的。您可以尝试另一种外观,也可以尝试配置您使用的外观。

您还可以在组件上安装另一个 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());
于 2013-03-08T11:29:28.383 回答