TITLE:JSliderのUIや色を変更する

Posted by terai at 2006-12-04

JSliderのUIや色を変更する

JSliderのトラックやつまみ、色などを変更して、音量調節風のスライダーを作成します。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

class TriangleSliderUI extends javax.swing.plaf.metal.MetalSliderUI {
  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) {
    int cx, cy, cw, ch;
    int pad;
    Rectangle trackBounds = trackRect;
    if(slider.getOrientation() == JSlider.HORIZONTAL ) {
      Graphics2D g2 = (Graphics2D)g;
//......
slider2.setUI(new javax.swing.plaf.metal.MetalSliderUI() {
  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);

解説

  • 上のJSlider
    • MetalSliderUI を継承するSliderUIをセットしています。このSliderUIは、paintThumb(Graphics)メソッドをオーバライドしてつまみの形を変更、paintTrack(Graphics)メソッドをオーバライドしてトラックの形と色を変更します。
  • 下のJSlider
    • JSlider#setForeground(Color)で、目盛のキャプションの色を青にしています。また、MetalSliderUI を継承するSliderUIを作成して、paintHorizontalLabel(Graphics, int, Component)メソッドをオーバライドし目盛を緑に変更しています。
    • 別の方法: JSliderの目盛にアイコンや文字列を追加する
  • 注意点
    • 垂直方向には対応していません。

参考リンク

コメント

  • Java SE 6 Runtime (JRE) Update N build 12 Kernel Installer だと、NullPointerException が発生する? -- terai
  • 別方法のメモ: -- terai
    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; }
    }