Круговой JSlider?

JSlider по умолчанию принимает форму прямой линии. Можем ли мы сделать JSlider кругом, напоминающим спидометр или круг с показаниями?

Если кто-то делал что-то похожее на эту задачу... Пожалуйста, поделитесь кодом...

Спасибо


person Jeetesh Nataraj    schedule 14.03.2011    source источник


Ответы (4)


JFreeChart имеет DialPlot, который может дать вам некоторые идеи о том, как сделать рендеринг.

person Catalina Island    schedule 14.03.2011

Для этого нет способа по умолчанию. Однако, если вы создаете пользовательский компонент, похоже, вам нужен какой-то циферблат, который можно было бы захватить и отрегулировать, а не ползунок, который делает это по кругу.

Это будет пользовательский компонент, создание которого будет средней, но интересной задачей. Трудная часть будет заключаться в том, чтобы он выглядел для пользователя как нечто регулируемое, а не просто отображающее значение. В реальной жизни спидометр доступен только для чтения.

person jzd    schedule 14.03.2011
comment
Сложная часть будет заключаться в том, чтобы пользователь выглядел как нечто регулируемое. Я чувствую, что более сложной частью будет настройка — движение влево/вправо или вверх/вниз легко выполняется с помощью мыши, но круглый сложнее. Клавиши со стрелками также хорошо соответствуют прямому ползунку, но плохо — круглому. - person Andrew Thompson; 14.03.2011

По стечению обстоятельств мне просто нужно было это для моего собственного приложения, я прошел через ваш вопрос, который мне не очень помог, а затем я дошел до того, что увидел, как люди используют 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.

person João Mendonça    schedule 16.06.2018

Насколько я знаю, для этого нет встроенной функции. Однако вы можете использовать такой класс, как этот JKnob и самостоятельно добавьте фактическое скользящее значение. (На самом деле у него есть метод getValue(), так что просто вызовите его и разделите на pi, чтобы получить значение от -1,0 до 1,0)

person Greg S.    schedule 26.05.2017