Рисование слайдера иконки JSlider

Хотите перерисовать маркер или большой палец JSlider вместо стандартного серого. Как я могу это достичь?

Существует три способа:

  1. изменить Java Look and Feel , Preferred of Ways
  2. OverRide XxxSliderUI, но это будет выглядеть и чувствовать себя чувствительным, а не простым способом
  3. обучение Synth Look and Feel

Пример использования Synth

Синтетический слайдер

SynthSliderTest.java

 import java.awt.*; import javax.swing.*; import javax.swing.plaf.synth.*; public class SynthSliderTest { private JFrame f = new JFrame(); public SynthSliderTest() { try { SynthLookAndFeel laf = new SynthLookAndFeel(); laf.load(SynthSliderTest.class.getResourceAsStream("yourPathTo/demo.xml"), SynthSliderTest.class); UIManager.setLookAndFeel(laf); } catch (Exception e) { e.printStackTrace(); } f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.getContentPane().add(makeUI()); f.setSize(320, 240); f.setLocationRelativeTo(null); f.setVisible(true); } public JComponent makeUI() { JSlider slider = new JSlider(0, 100); JPanel p = new JPanel(); p.add(slider); return p; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { SynthSliderTest synthSliderTest = new SynthSliderTest(); } }); } } 

Файл demo.xml

          

Расширение делегата BasicSliderUI не без BasicSliderUI , но это позволяет произвольный контроль над рендерингом, как это предлагается в приведенном ниже примере.

Подкласс подкласса BasicSliderUI

 slider.setUI(new MySliderUI(slider)); ... private static class MySliderUI extends BasicSliderUI { private static float[] fracs = {0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1.0f}; private LinearGradientPaint p; public MySliderUI(JSlider slider) { super(slider); } @Override public void paintTrack(Graphics g) { Graphics2D g2d = (Graphics2D) g; Rectangle t = trackRect; Point2D start = new Point2D.Float(tx, ty); Point2D end = new Point2D.Float(t.width, t.height); Color[] colors = {Color.magenta, Color.blue, Color.cyan, Color.green, Color.yellow, Color.red}; p = new LinearGradientPaint(start, end, fracs, colors); g2d.setPaint(p); g2d.fillRect(tx, ty, t.width, t.height); } @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.black); int tw2 = t.width / 2; g2d.drawLine(tx, ty, tx + t.width - 1, ty); g2d.drawLine(tx, ty, tx + tw2, ty + t.height); g2d.drawLine(tx + t.width - 1, ty, tx + tw2, ty + t.height); } } 
  • Как правильно выровнять значок в JLabel?
  • Java: JProgressBar (или эквивалент) в заголовке вкладки JTabbedPane
  • Изменение размера с canvasом в jscrollpane в jsplitpane
  • Ограничение количества символов JTextField и прием только числовых символов
  • «Всегда поверх» Windows с Java
  • Как добавить гиперссылку в JLabel
  • Отключить кнопку ok на JOptionPane.dialog, пока пользователь не даст вход
  • Java / Swing: получить окно / JFrame изнутри JPanel
  • Расширяет JFrame и создает его внутри программы
  • Поворот изображения с помощью AffineTransform
  • Java: использование изображения в виде кнопки
  • Давайте будем гением компьютера.