線の結合方式の設定

広告

線の結合方式の設定を行います。結合方式とは線が連続して描画される時に線と線の結合する部分の形状を指定します。次のコンストラクタを使用します。

指定された属性を持つ実線の BasicStroke を構築します。デフォルト値でかま
わない場合や、ライン接合が JOIN_MITER に指定されていない場合は、
miterlimit パラメータは不要です。 

パラメータ:
  width - BasicStroke の幅
  cap - BasicStroke の両端の装飾
  join - 輪郭線セグメントの接合部の装飾 
例外: 
  IllegalArgumentException - width が負の値の場合 
  IllegalArgumentException - cap が CAP_BUTT、CAP_ROUND、または
    CAP_SQUARE のどれでもない場合 
  IllegalArgumentException - join が JOIN_ROUND、JOIN_BEVEL、または
    JOIN_MITER のどれでもない場合

1番目の引数に線の太さを表すfloat型の値を指定します。

2番目の引数に線の両端の形状を表すint型の値を指定します。

3番目の引数に線の結合方式を表すint型の値を指定します。指定できる値はBasicStrokeクラスで定義されており次のいずれかです。

形状
static int JOIN_BEVEL幅の広い輪郭線の外側の角を直線セグメントに接合するようにして輪郭線セグメントを接合します。
static int JOIN_MITERラインセグメントの外側の端が重なるまで延長して輪郭線セグメントを接合します。
static int JOIN_ROUNDライン幅の半分の長さを半径として、角を丸く切り落として輪郭線セグメントを接合します。

具体的には次のように記述します。

public void paintComponent(Graphics g){
  Graphics2D g2 = (Graphics2D)g;

  BasicStroke wideStroke
    = new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
  g2.setStroke(wideStroke);
  
  g2.draw(new Line2D.Double(50, 50, 160, 180));
}

サンプルプログラム

簡単なサンプルを一度試してみます。

StrokeTest3.java

import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.*;
import java.awt.BasicStroke;

public class StrokeTest3 extends JPanel{

  public static void main(String[] args){
    JFrame frame = new JFrame();

    StrokeTest3 app = new StrokeTest3();
    frame.getContentPane().add(app);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D)g;

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                        RenderingHints.VALUE_ANTIALIAS_ON);

    BasicStroke joinStroke
      = new BasicStroke(20.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
    g2.setStroke(joinStroke);

    GeneralPath polygon = new GeneralPath();
    polygon.moveTo(20, 150);
    polygon.lineTo(50, 50);
    polygon.lineTo(80, 150);
    g2.draw(polygon);

    polygon.reset();

    BasicStroke miterStroke
      = new BasicStroke(20.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
    g2.setStroke(miterStroke);

    polygon.moveTo(120, 150);
    polygon.lineTo(150, 50);
    polygon.lineTo(180, 150);
    g2.draw(polygon);

    polygon.reset();

    BasicStroke roundStroke
      = new BasicStroke(20.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND);
    g2.setStroke(roundStroke);

    polygon.moveTo(220, 150);
    polygon.lineTo(250, 50);
    polygon.lineTo(280, 150);
    g2.draw(polygon);
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

線の結合方式を設定する

( Written by Tatsuo Ikura )