我想创建一个只有四个可能值的 JSlider:10(最小值)、30、60 和 100(最大值)。是否可以创建一个只能“捕捉”到这些值的值?如果是这样,你能举个例子吗?谢谢!
问问题
1973 次
2 回答
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();
}
});
}
}
于 2013-07-30T03:20:46.723 回答
-1
编写一个覆盖getValue() 的JSlider 子类并将例如[1,2,3,4](原始)映射到[10,30,60,100]。我想到的最简单的解决方案。
于 2013-07-30T00:52:25.700 回答