破線パターンの設定

広告

線の表示方法として実線の代わりに破線を表示する方法を確認します。色々な破線パターンが用意されているのではなく破線のパターンを自分で定義します。次のコンストラクタを使用します。

指定された属性を持つ新しい BasicStroke を構築します。

パラメータ:
  width - この BasicStroke の幅。値は 0.0f 以上でなければならない。幅
    が 0.0f に設定されている場合、ストロークは対象のデバイス上のもっと
    も細いラインとして描画される。 また、このときアンチエイリアス設定
    が使用される
  cap - BasicStroke の両端の装飾
  join - 輪郭線セグメントの接合部の装飾
  miterlimit - 接合トリミングの制限値。miterlimit は 1.0f 以上でなけれ
    ばならない
  dash - 破線パターンを表す配列
  dash_phase - 破線パターン開始位置のオフセット 
例外:
  IllegalArgumentException - width が負の値の場合 
  IllegalArgumentException - cap が CAP_BUTT、CAP_ROUND、または CAP_SQUARE
    のどれでもない場合 
  IllegalArgumentException - miterlimit が 1 より小さく、 join が
    JOIN_MITER の場合 
  IllegalArgumentException - join が JOIN_ROUND、JOIN_BEVEL、または
    JOIN_MITER のどれでもない場合 
  IllegalArgumentException - dash_phase が負の値で、 dash が null でな
    い場合
  IllegalArgumentException - dash の長さが ゼロの場合 
  IllegalArgumentException - 破線の長さがすべてゼロの場合

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

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

3番目の引数に線の結合方式を表すint型の値を指定します。今回はJOIN_MITERを指定します。

4番目の引数に線の太さの何倍までであれば突起部分を表示するかを表すfloat型の値を指定します。

5番目の引数に破線パターンを表すfloat型の配列を指定します。そして6番目の引数に5番目の引数で指定した破線パターンの開始オフセットをfloat型の値で指定します。詳細は後述します。

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

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

  float dash[] = {10.0f, 3.0f};
  BasicStroke dashStroke = new BasicStroke(4.0f, 
                                           BasicStroke.CAP_BUTT, 
                                           BasicStroke.JOIN_MITER, 
                                           10.0f, 
                                           dash, 
                                           0.0f);
  g2.setStroke(dashStroke);

  g2.draw(new Line2D.Double(50, 50, 160, 180));
}

破線パターン

破線のパターンを1つしか指定していない場合は、表示部分としない部分が繰り返されます。下記の場合は、長さ3.0fの部分が繰り返されます。

float dash[] = {3.0f};
***___***___***___***___***___***___***

破線のパターンを2つ指定した場合は、1番目に指定した長さを表示し、2番目に指定した長さだけ表示しない部分が繰り返されます。下記の場合は、長さ4.0fの表示部分と長さ2.0fの表示されない部分が繰り返されます。

float dash1[] = {4.0f, 2.0f};
****__****__****__****__****__****__****__

破線のパターンをより複雑にした場合も今までと同様です。表示される部分とされない部分が配列に指定した値の数だけ繰り替えされます。

float dash1[] = {8.0f, 2.0f, 2.0f, 3.0f};
********__**___********__**___********__**___

破線のオフセット

破線のパターンを定義した後で、どの位置から表示を開始するかをオフセットで指定します。

例えば下記のような破線パターンがあった場合で考えてみます。

float dash1[] = {4.0f, 2.0f};
****__****__****__****__****__****__****__

オフセットを変更することで表示される破線は次のように変化します。

dash_phase=0.0f
****__****__****__****__****__****__****__

dash_phase=1.0f
***__****__****__****__****__****__****__*

dash_phase=2.0f
**__****__****__****__****__****__****__**

サンプルプログラム

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

StrokeTest5.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 StrokeTest5 extends JPanel{

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

    StrokeTest5 app = new StrokeTest5();
    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);

    float dash1[] = {10.0f, 3.0f};
    BasicStroke dsahStroke1 = new BasicStroke(2.0f, 
                                              BasicStroke.CAP_BUTT, 
                                              BasicStroke.JOIN_MITER, 
                                              3.0f,
                                              dash1,
                                              0.0f);
    g2.setStroke(dsahStroke1);

    g2.draw(new Line2D.Double(50, 30, 230, 30));

    BasicStroke dsahStroke2 = new BasicStroke(2.0f, 
                                              BasicStroke.CAP_BUTT, 
                                              BasicStroke.JOIN_MITER, 
                                              3.0f,
                                              dash1,
                                              3.0f);
    g2.setStroke(dsahStroke2);

    g2.draw(new Line2D.Double(50, 80, 230, 80));

    float dash2[] = {10.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f};
    BasicStroke dsahStroke3 = new BasicStroke(2.0f, 
                                              BasicStroke.CAP_BUTT, 
                                              BasicStroke.JOIN_MITER, 
                                              3.0f,
                                              dash2,
                                              0.0f);
    g2.setStroke(dsahStroke3);

    g2.draw(new Line2D.Double(50, 130, 230, 130));
  }
}

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

線の破線方式を設定する

( Written by Tatsuo Ikura )