TITLE:Separatorを波線で表示

Posted by terai at 2006-06-19

Separatorを波線で表示

波線を使ったSeparatorを作成します。

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

#screenshot

サンプルコード

class WavyLineSeparator extends JSeparator{
  private final static int ICONWIDTH = 3;
  private final Icon tileIcon;
  public WavyLineSeparator() {
    this(SwingConstants.HORIZONTAL);
  }
  public WavyLineSeparator(int orientation) {
    super(orientation);
    tileIcon = new WavyLineIcon();
    if(orientation==SwingConstants.HORIZONTAL) {
      setBorder(BorderFactory.createEmptyBorder(2,1,2,1));
      int w = ICONWIDTH+getInsets().top+getInsets().bottom;
      setPreferredSize(new Dimension(100, w));
      setMinimumSize(new Dimension(0, w));
      setMaximumSize(new Dimension(Integer.MAX_VALUE, w));
    }else{
      setBorder(BorderFactory.createEmptyBorder(1,2,1,2));
      int w = ICONWIDTH+getInsets().left+getInsets().right;
      setPreferredSize(new Dimension(w, 30));
      setMinimumSize(new Dimension(w, 0));
      setMaximumSize(new Dimension(w, Integer.MAX_VALUE));
    }
  }
  @Override
  public void paintComponent(Graphics g) {
    //super.paintComponent(g);
    int xpos, ypos;
    int tileW = tileIcon.getIconWidth();
    int tileH = tileIcon.getIconHeight();
    Insets i = getInsets();
    if(getOrientation()==SwingConstants.HORIZONTAL) {
      for(xpos = i.left; getWidth() - xpos > 0; xpos += tileW) {
        tileIcon.paintIcon(this, g, xpos, i.top);
      }
    }else{
      for(ypos = i.top; getHeight() - ypos > 0; ypos += tileH) {
        tileIcon.paintIcon(this, g, i.left, ypos);
      }
    }
  }
  class WavyLineIcon implements Icon {
    private final Color sfc = UIManager.getColor("Separator.foreground");
    @Override public void paintIcon(Component c, Graphics g, int x, int y) {
      Graphics2D g2 = (Graphics2D)g;
      AffineTransform oldTransform = g2.getTransform();
      g2.setPaint(sfc);
      if(getOrientation()==SwingConstants.VERTICAL) {
        g2.translate(x+getIconWidth(), y);
        g2.rotate(Math.PI/2);
      }else{
        g2.translate(x,y);
      }
      g2.drawLine( 0, 2, 0, 2 );
      g2.drawLine( 1, 1, 1, 1 );
      g2.drawLine( 2, 0, 3, 0 );
      g2.drawLine( 4, 1, 4, 1 );
      g2.drawLine( 5, 2, 5, 2 );
      g2.setTransform(oldTransform); 
    }
    @Override public int getIconWidth()  {
      return (getOrientation()==SwingConstants.HORIZONTAL)?
        ICONWIDTH*2:ICONWIDTH;
    }
    @Override public int getIconHeight() {
      return (getOrientation()==SwingConstants.HORIZONTAL)?
        ICONWIDTH:ICONWIDTH*2;
    }
  }
}

解説

水平用の波パターンIconを作成して、これを順番に並べてセパレータとして描画しています。垂直用のパターンは水平用を回転して生成しています。

コメント

  • SwingConstants.VERTICAL に対応しました。 -- terai