Круговой JSlider? - PullRequest
       10

Круговой JSlider?

2 голосов
/ 14 марта 2011

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

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

Спасибо

Ответы [ 4 ]

2 голосов
/ 14 марта 2011

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

2 голосов
/ 14 марта 2011

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

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

1 голос
/ 16 июня 2018

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

0 голосов
/ 26 мая 2017

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

...