绘制JSlider的滑块图标

想要重新绘制JSlider的标记或拇指而不是标准灰色。 我怎样才能做到这一点?

有三种方法:

  1. 改变Java外观 , Preferred of Ways
  2. OverRide XxxSliderUI,但那将是Look and Feel敏感,而不是简单的方法
  3. 学习合成的外观和感觉

使用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子类图像

 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); } }