我想创建一个只有四个可能值的JSlider:10(min),30,60和100(max)。是否有可能创建一个只能“捕捉”到这些值?如果是这样,你能举个例子吗?谢谢!
答案 0 :(得分:4)
以下示例可能是您正在寻找的最简单的方法。请注意,您不能简单地覆盖JSlider子类上的getValue()以返回特定于域的值,因为这对底层JSlider / BasicSliderUI实现是有问题的。在这个例子中,我定义了一个自定义的getDomainValue()来根据滑块刻度位置返回特定于域的值(10,30,60或100)。
package example.stackoverflow;
import java.util.Hashtable;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SteppingSliderExample
{
public static class SteppingSlider extends JSlider
{
private static final long serialVersionUID = -1195270044097152629L;
private static final Integer[] VALUES = { 10, 30, 60, 100 };
private static final Hashtable<Integer, JLabel> LABELS = new Hashtable<>();
static
{
for(int i = 0; i < VALUES.length; ++i)
{
LABELS.put(i, new JLabel(VALUES[i].toString()));
}
}
public SteppingSlider()
{
super(0, VALUES.length - 1, 0);
setLabelTable(LABELS);
setPaintTicks(true);
setPaintLabels(true);
setSnapToTicks(true);
setMajorTickSpacing(1);
}
public int getDomainValue()
{
return VALUES[getValue()];
}
}
public static void createAndShowGUI()
{
JFrame frame = new JFrame("SteppingSlider");
frame.setSize(500, 120);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final SteppingSlider steppingSlider = new SteppingSlider();
final String labelPrefix = "Slider value: ";
final JLabel output = new JLabel(labelPrefix + steppingSlider.getDomainValue());
steppingSlider.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent evt)
{
output.setText(labelPrefix + steppingSlider.getDomainValue());
}
});
frame.getContentPane().setLayout(
new BoxLayout(frame.getContentPane(),
BoxLayout.Y_AXIS));
frame.getContentPane().add(steppingSlider);
frame.getContentPane().add(output);
frame.setVisible(true);
}
public static void main(String[] args) throws Exception
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}
答案 1 :(得分:-1)
写一个JSlider的子类来覆盖getValue()和map,例如[1,2,3,4](原件)至[10,30,60,100]。我想到的最简单的解决方案。