【问题标题】:Circular JSlider?圆形JSlider?
【发布时间】:2011-03-14 11:41:53
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: java swing jslider


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • “困难的部分是让它在用户看来是可调整的。”我觉得困难的部分是调整它——左/右或用鼠标上下移动很容易,但圆形更难。箭头键也可以很好地映射到直线滑块,但很难映射到圆形滑块。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-09-11
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 2016-02-14
          • 1970-01-01
          • 2020-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多