Java JSlider捕捉到每90个数字
我的JFrame窗口具有系统外观,当我添加一个JSlider并单击它的线条时,它只向前或向后移动90步,这取决于我的鼠标位置。我想让钻石进入我的鼠标,就像我点击并拖动钻石一样工作 这是一个最小的程序,但我认为这只发生在Windows中,因为在默认的外观中,它没有捕捉到第90个数字,而是只前进了一个数字Java JSlider捕捉到每90个数字,java,slider,jslider,Java,Slider,Jslider,我的JFrame窗口具有系统外观,当我添加一个JSlider并单击它的线条时,它只向前或向后移动90步,这取决于我的鼠标位置。我想让钻石进入我的鼠标,就像我点击并拖动钻石一样工作 这是一个最小的程序,但我认为这只发生在Windows中,因为在默认的外观中,它没有捕捉到第90个数字,而是只前进了一个数字 import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@SuppressWarnings("serial")
public class Test extends JFrame {
int value = 300;
JSlider slider;
JLabel label;
public Test() {
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
label = new JLabel(String.valueOf(value));
slider = new JSlider();
slider.setMinimum(100);
slider.setMaximum(1000);
slider.setValue(value);
slider.setSnapToTicks(false);
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
label.setText(String.valueOf(slider.getValue()));
}
});
add(label, BorderLayout.NORTH);
add(slider);
setVisible(true);
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new Test();
}
}
此示例基于此,稍作修改以删除/添加MouseMotionListener和MouseStener,使拇指滑块的绘制更符合默认行为。现在,拖动拇指时,拇指将绘制在与鼠标相同的相对位置,而不是左侧
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;
public class SliderMousePressed extends JPanel
{
public SliderMousePressed()
{
JSlider slider = new JSlider(0, 50, 20);
slider.setMajorTickSpacing(10);
slider.setMinorTickSpacing(5);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
add(slider);
snapToMouseClick( slider );
}
public static void snapToMouseClick(final JSlider slider)
{
MouseListener[] ml = slider.getMouseListeners();
for (MouseListener l : ml)
slider.removeMouseListener(l);
MouseMotionListener[] mml = slider.getMouseMotionListeners();
for (MouseMotionListener l : mml)
slider.removeMouseMotionListener(l);
final BasicSliderUI ui = (BasicSliderUI)slider.getUI();
BasicSliderUI.TrackListener tl = ui.new TrackListener()
{
// Position slider at mouse
@Override
public void mouseClicked(MouseEvent e)
{
Point p = e.getPoint();
int value = ui.valueForXPosition(p.x);
slider.setValue(value);
}
// Prevent scrolling while mouse button is held down
@Override
public boolean shouldScroll(int dir)
{
return false;
}
};
slider.addMouseListener(tl);
slider.addMouseMotionListener(tl);
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("SliderMousePressed");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new SliderMousePressed() );
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}