Java 圆形滑翔机?

Java 圆形滑翔机?,java,swing,jslider,Java,Swing,Jslider,默认情况下,JSlider采用直线形状。我们能把JSlider做成一个类似于测速仪或带读数的圆圈吗 如果有人做过类似的事情。。。请分享代码 谢谢你没有默认的方法可以做到这一点。然而,如果你正在创建一个自定义组件,听起来你想要的是某种可以抓取和调整的拨号盘,而不是一个圆形的滑块 这将是一个定制组件,它将是一个中等但有趣的任务。最难的部分是让用户觉得它是可调整的,而不仅仅是显示一个值。在现实生活中,车速表是只读的。JFreeChart有一个可以给你一些关于如何渲染的想法。据我所知,没有内置的函数可以

默认情况下,JSlider采用直线形状。我们能把JSlider做成一个类似于测速仪或带读数的圆圈吗

如果有人做过类似的事情。。。请分享代码


谢谢你

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


这将是一个定制组件,它将是一个中等但有趣的任务。最难的部分是让用户觉得它是可调整的,而不仅仅是显示一个值。在现实生活中,车速表是只读的。

JFreeChart有一个可以给你一些关于如何渲染的想法。

据我所知,没有内置的函数可以做到这一点。但是,您可以使用诸如和之类的类,自己添加实际的滑动值。实际上,它有一个getValue方法,所以只要调用该方法并除以pi,就可以得到一个从-1.0到1.0的值。巧合的是,我只是在我自己的应用程序中需要这个,我通过了你的问题,但这并没有真正帮助我,然后我看到人们使用Graphics2D

我真的总是把图形g看作一个100头的怪物,想谋杀我的整个家庭,但我决定面对我的恐惧,得到一个三角形的代码,并设法把它画成一个圆圈

这比我想象的要容易得多:

结果: 无法添加图像,声誉不佳:
如果您喜欢MetalSliderUI的外观,请使用该外观,而不是基本的SliderUI。

最难的部分是让用户觉得它是可调节的。。我觉得更难的部分是调整它-用鼠标左/右或上/下移动很容易,但圆形更难。箭头键也可以很好地映射到直滑块,但很难映射到圆形滑块。
 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);
}