• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JSliderのUIや色を変更する
#navi(../)
#tags(JSlider)
RIGHT:Posted by &author(aterai); at 2006-12-04
*JSliderのUIや色を変更する [#p7ba80c2]
JSliderのトラックやつまみ、色などを変更して、音量調節風のスライダーを作成します。
``JSlider``のトラックやつまみ、色などを変更して、音量調節風のスライダーを作成します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTWc-B0OXI/AAAAAAAAApQ/t1b78yBXWUQ/s800/VolumeSlider.png)

**サンプルコード [#v26925b9]
#code(link){{
class TriangleSliderUI extends javax.swing.plaf.metal.MetalSliderUI {
  public void paintThumb(Graphics g) {
  @Override public void paintThumb(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.fillOval(thumbRect.x,thumbRect.y,thumbRect.width,thumbRect.height);
  }
  public void paintTrack(Graphics g) {
  @Override public void paintTrack(Graphics g) {
    int cx, cy, cw, ch;
    int pad;
    Rectangle trackBounds = trackRect;
    if(slider.getOrientation() == JSlider.HORIZONTAL ) {
      Graphics2D g2 = (Graphics2D)g;

//......
}}
#code{{

slider2.setUI(new javax.swing.plaf.metal.MetalSliderUI() {
  protected void paintHorizontalLabel(Graphics g, int v, Component l) {
  @Override protected void paintHorizontalLabel(Graphics g, int v, Component l) {
    JLabel lbl = (JLabel)l;
    lbl.setForeground(Color.GREEN);
    super.paintHorizontalLabel(g,v,lbl);
  }
});
slider2.setForeground(Color.BLUE);
}}

**解説 [#ra75f08b]
- 上のJSlider
-- MetalSliderUI を継承するSliderUIをセットしています。このSliderUIは、paintThumb(Graphics)メソッドをオーバライドしてつまみの形を変更、paintTrack(Graphics)メソッドをオーバライドしてトラックの形と色を変更します。
- 上の``JSlider``
-- ``MetalSliderUI``を継承する``SliderUI``をセットしています。この``SliderUI``は、``paintThumb(Graphics)``メソッドをオーバライドしてつまみの形を変更、``paintTrack(Graphics)``メソッドをオーバライドしてトラックの形と色を変更します。

- 下のJSlider
-- JSlider#setForeground(Color)で、目盛のキャプションの色を青にしています。また、MetalSliderUI を継承するSliderUIを作成して、paintHorizontalLabel(Graphics, int, Component)メソッドをオーバライドし目盛を緑に変更しています。
- 下の``JSlider``
-- ``JSlider#setForeground(Color)``で、目盛のキャプションの色を青にしています。また、``MetalSliderUI``を継承する``SliderUI``を作成して、``paintHorizontalLabel(Graphics, int, Component)``メソッドをオーバライドし目盛を緑色に変更しています。
-- 別の方法: [[JSliderの目盛にアイコンや文字列を追加する>Swing/SliderLabelTable]]

- 注意点
-- 垂直方向には対応していません。

**参考リンク [#y5a9ba94]
-[http://forums.sun.com/thread.jspa?threadID=702119 Swing - Problem in changing forground color of JSlider!!]
-[[JSliderの目盛にアイコンや文字列を追加する>Swing/SliderLabelTable]]

**コメント [#zda46898]
- Java SE 6 Runtime (JRE) Update N build 12 Kernel Installer だと、NullPointerException が発生する? -- [[aterai]] &new{2008-03-03 (月) 19:34:50};
- ``Java SE 6 Runtime (JRE) Update N build 12 Kernel Installer``だと、``NullPointerException``が発生する? -- [[aterai]] &new{2008-03-03 (月) 19:34:50};
- %%別方法のメモ:%% [[JSliderの目盛りをアイコンに変更する>Swing/TriangleTickSlider]]に移動 -- [[aterai]] &new{2010-05-19 (水) 16:52:13};
- メモ: [http://bugs.sun.com/view_bug.do?bug_id=5099681 Bug ID: 5099681 Windows/Motif L&F: JSlider should use foreground color for ticks.] -- [[aterai]] &new{2010-05-20 (木) 17:24:52};
- メモ: [http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5099681 Bug ID: 5099681 Windows/Motif L&F: JSlider should use foreground color for ticks.] -- [[aterai]] &new{2010-05-20 (木) 17:24:52};

#comment