JSlider по умолчанию принимает форму прямой линии. Можем ли мы сделать JSlider кругом, напоминающим спидометр или круг с показаниями?
Если кто-то делал что-то похожее на эту задачу... Пожалуйста, поделитесь кодом...
Спасибо
JSlider по умолчанию принимает форму прямой линии. Можем ли мы сделать JSlider кругом, напоминающим спидометр или круг с показаниями?
Если кто-то делал что-то похожее на эту задачу... Пожалуйста, поделитесь кодом...
Спасибо
JFreeChart имеет DialPlot
, который может дать вам некоторые идеи о том, как сделать рендеринг.
Для этого нет способа по умолчанию. Однако, если вы создаете пользовательский компонент, похоже, вам нужен какой-то циферблат, который можно было бы захватить и отрегулировать, а не ползунок, который делает это по кругу.
Это будет пользовательский компонент, создание которого будет средней, но интересной задачей. Трудная часть будет заключаться в том, чтобы он выглядел для пользователя как нечто регулируемое, а не просто отображающее значение. В реальной жизни спидометр доступен только для чтения.
По стечению обстоятельств мне просто нужно было это для моего собственного приложения, я прошел через ваш вопрос, который мне не очень помог, а затем я дошел до того, что увидел, как люди используют 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.
Насколько я знаю, для этого нет встроенной функции. Однако вы можете использовать такой класс, как этот JKnob и самостоятельно добавьте фактическое скользящее значение. (На самом деле у него есть метод getValue(), так что просто вызовите его и разделите на pi, чтобы получить значение от -1,0 до 1,0)