2

默认情况下,JSlider 采用直线形状。我们可以把 JSlider 做成一个类似于 speed-o-meter 的圆圈或带有读数的圆圈吗?

如果有人做过与此任务类似的事情...请分享代码...

谢谢你

4

4 回答 4

2

没有默认的方法来做到这一点。但是,如果您正在创建自定义组件,听起来您想要某种可以抓取和调整的表盘,而不是圆形的滑块。

这将是一个自定义组件,创建起来将是一项中等但有趣的任务。困难的部分是让它在用户看来是可调整的,而不仅仅是显示一个值。在现实生活中,速度表是只读的。

于 2011-03-14T12:27:47.030 回答
2

JFreeChart 有一个DialPlot可能会给你一些关于如何进行渲染的想法。

于 2011-03-14T18:35:34.390 回答
1

巧合的是,我只是需要这个用于我自己的应用程序,我通过了你的问题,这并没有真正帮助我,然后我看到人们使用 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。

于 2018-06-16T04:14:35.527 回答
0

据我所知,没有内置功能可以做到这一点。但是,您可以使用诸如此 JKnob之类的类并自己添加实际的滑动值。(实际上,它有一个 getValue() 方法,所以只需调用它并除以 pi 即可得到一个从 -1.0 到 1.0 的值)

于 2017-05-26T17:34:51.270 回答