• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JSliderのUIや色を変更する
#navi(../)
RIGHT:Posted by [[terai]] at 2006-12-04
*JSliderのUIや色を変更する [#p7ba80c2]
JSliderのトラックやつまみ、色などを変更して、音量調節風のスライダーを作成します。
---
category: swing
folder: VolumeSlider
title: JSliderのUIや色を変更する
tags: [JSlider]
author: aterai
pubdate: 2006-12-04T02:52:00+09:00
description: JSliderのトラックやつまみ、色などを変更して、音量調節風のスライダーを作成します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTWc-B0OXI/AAAAAAAAApQ/t1b78yBXWUQ/s800/VolumeSlider.png
---
* 概要 [#summary]
`JSlider`のトラックやつまみ、色などを変更して、音量調節風のスライダーを作成します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTWc-B0OXI/AAAAAAAAApQ/t1b78yBXWUQ/s800/VolumeSlider.png)

#screenshot

**サンプルコード [#v26925b9]
#code{{
class TriangleSliderUI extends javax.swing.plaf.metal.MetalSliderUI {
  public void paintThumb(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
* サンプルコード [#sourcecode]
#code(link){{
class TriangleSliderUI extends MetalSliderUI {
  @Override public void paintThumb(Graphics g) {
    Graphics2D g2 = (Graphics2D) g.create();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.fillOval(thumbRect.x,thumbRect.y,thumbRect.width,thumbRect.height);
    g2.fillOval(thumbRect.x, thumbRect.y, thumbRect.width, thumbRect.height);
    g2.dispose();
  }
  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) {
    JLabel lbl = (JLabel)l;
    if (slider.getOrientation() == SwingConstants.HORIZONTAL ) {
      Graphics2D g2 = (Graphics2D) g.create();

// ...

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

**解説 [#ra75f08b]
- 上のJSlider
-- MetalSliderUI を継承するSliderUIをセットしています。このSliderUIは、paintThumb(Graphics)メソッドをオーバライドしてつまみの形を変更、paintTrack(Graphics)メソッドをオーバライドしてトラックの形と色を変更します。
* 解説 [#explanation]
- 上: `TriangleSliderUI`
-- `MetalSliderUI`を継承する`SliderUI`を設定
--- `paintThumb(Graphics)`メソッドをオーバーライドしてつまみの形を変更
--- `paintTrack(Graphics)`メソッドをオーバーライドしてトラックの形と色を変更
-- 注: 垂直方向には未対応
- 下: `HorizontalLabelColor`
-- `JSlider#setForeground(Color)`メソッドで目盛の色を青に変更
-- `MetalSliderUI`を継承する`SliderUI`を作成
--- `paintHorizontalLabel(Graphics, int, Component)`メソッドをオーバーライドし目盛を緑色に変更
-- 目盛の色は[[JSliderの目盛にアイコンや文字列を追加する>Swing/SliderLabelTable]]でも変更可能

- 下のJSlider
-- JSlider#setForeground(Color)で、目盛のキャプションの色を青にしています。また、MetalSliderUI を継承するSliderUIを作成して、paintHorizontalLabel(Graphics, int, Component)メソッドをオーバライドし目盛を緑に変更しています。
-- 別の方法: [[JSliderの目盛にアイコンや文字列を追加する>Swing/SliderLabelTable]]
* 参考リンク [#reference]
- [https://community.oracle.com/thread/1375990 Swing - Problem in changing forground color of JSlider!!]
- [[JSliderの目盛にアイコンや文字列を追加する>Swing/SliderLabelTable]]
- [[JPopupMenuに垂直JSliderを配置してJToggleButtonの上部に表示する>Swing/PopupVolumeSlider]]

- 注意点
-- 垂直方向には対応していません。
* コメント [#comment]
#comment
- `Java SE 6 Runtime (JRE) Update N build 12 Kernel Installer`だと、`NullPointerException`が発生する? -- &user(aterai); &new{2008-03-03 (月) 19:34:50};
- %%別方法のメモ:%% [[JSliderの目盛りをアイコンに変更する>Swing/TriangleTickSlider]]に移動。 -- &user(aterai); &new{2010-05-19 (水) 16:52:13};
- メモ: [https://bugs.openjdk.org/browse/JDK-5099681 Bug ID: 5099681 Windows/Motif L&F: JSlider should use foreground color for ticks.] -- &user(aterai); &new{2010-05-20 (木) 17:24:52};

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

**コメント [#zda46898]
- Java SE 6 Runtime (JRE) Update N build 12 Kernel Installer だと、NullPointerException が発生する? -- [[terai]] &new{2008-03-03 (月) 19:34:50};
- 別方法のメモ: -- [[terai]] &new{2010-05-19 (水) 16:52:13};
#code{{
pulbic JSlider makeSlider() {
  JSlider slider = new JSlider(0,100);
  slider.setMajorTickSpacing(10);
  slider.setMinorTickSpacing(5);
  //slider.setPaintTicks(true);
  slider.setPaintLabels(true);
  Dictionary dictionary = slider.getLabelTable();
  if (dictionary != null) {
    Enumeration elements = dictionary.elements();
    while (elements.hasMoreElements()) {
      JLabel label = (JLabel) elements.nextElement();
      label.setIcon(new TickIcon());
      label.setIconTextGap(0);
      label.setVerticalAlignment(SwingConstants.TOP);
      label.setVerticalTextPosition(SwingConstants.BOTTOM);
      label.setHorizontalAlignment(SwingConstants.CENTER);
     label.setHorizontalTextPosition(SwingConstants.CENTER);
      label.setForeground(Color.RED);
    }
  }
}
class TickIcon implements Icon {
  @Override public void paintIcon(Component c,Graphics g,int x,int y) {
    g.setColor(Color.GREEN);
    g.drawLine( x+2, y-1, x+2, y+1 );
    g.drawLine( x+1, y+0, x+3, y+0 );
    g.drawLine( x+0, y+1, x+4, y+1 );
  }
  @Override public int getIconWidth()  { return 5; }
  @Override public int getIconHeight() { return 3; }
}
}}

#comment