【发布时间】:2011-03-14 11:41:53
【问题描述】:
默认情况下,JSlider 采用直线形状。我们能不能把JSlider做成一个类似于测速仪的圆或者带读数的圆?
如果有人做过类似的事情...请分享代码...
谢谢
【问题讨论】:
默认情况下,JSlider 采用直线形状。我们能不能把JSlider做成一个类似于测速仪的圆或者带读数的圆?
如果有人做过类似的事情...请分享代码...
谢谢
【问题讨论】:
JFreeChart 有一个DialPlot,它可能会给你一些关于如何进行渲染的想法。
【讨论】:
没有默认的方法来做到这一点。但是,如果您正在创建自定义组件,听起来您想要某种可以抓取和调整的表盘,而不是圆形的滑块。
这将是一个自定义组件,创建起来会是一个中等但有趣的任务。困难的部分是让它在用户看来是可调整的,而不仅仅是显示一个值。在现实生活中,速度计是只读的。
【讨论】:
巧合的是,我只是在自己的应用程序中需要这个,我通过了你的问题,这并没有真正帮助我,然后我看到人们使用 Graphics2D。
我真的一直把 Graphics g 看作是一个想要谋杀我全家的 100 头怪物,但我决定直面自己的恐惧,得到一个可以组成三角形的代码,并设法用它做出一个圆圈。
这比我想象的要容易得多:
public class CustomSlider extends JSlider{
public CustomSlider(int begin, int end) {
super(begin, end);
setFont(new CustomFont(10));
setPaintTrack(true);
setUI(new BasicSliderUI(this) {
/*Sets the size of the Handler, should be the same as the OVAL size*/
@Override
protected Dimension getThumbSize() {
return new Dimension(25,25);
}
/*Painting the THUMB as a OVAL in the x and y positions of thumbRect (The Handle)*/
@Override
public void paintThumb(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Rectangle t = thumbRect;
g2d.setColor(Color.BLUE);
g2d.fillOval(t.x, t.y, 25, 25);
}
});
/* Set JLabels for specific Values*/
Hashtable<Integer, JLabel> position = new Hashtable<Integer, JLabel>();
position.put(0, new JLabel("HELP"));
position.put(1, new JLabel("NORMAL"));
position.put(2, new JLabel("CHAOS"));
setLabelTable(position);
setPaintLabels(true);
}
结果:https://i.stack.imgur.com/0OiKL.png (无法添加图片,缺乏声誉:() 如果您更喜欢 MetalSliderUI 的外观,请使用该外观而不是 BasicSliderUI。
【讨论】:
据我所知,没有内置函数可以做到这一点。但是,您可以使用诸如this JKnob 之类的类并自己添加实际的滑动值。 (实际上它有一个 getValue() 方法,所以只需调用它并除以 pi 即可得到一个从 -1.0 到 1.0 的值)
【讨论】: