gpt4 book ai didi

java - JSlider : can't make the knob move on the closest tick during drag

转载 作者:搜寻专家 更新时间:2023-11-01 00:51:16 25 4
gpt4 key购买 nike

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

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

最佳答案

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

您还可以在您的组件上安装另一个 UI 委托(delegate)。

查看此 real world example of customizing the behavior of a swing component .

编辑

我想出了一个丑陋的 hack 来完成这项工作。此代码完全依赖于 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());

关于java - JSlider : can't make the knob move on the closest tick during drag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15292631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com