- Home ›
- Java2Dによる画像処理 ›
- 線属性 ›
- HERE
破線パターンの設定
線の表示方法として実線の代わりに破線を表示する方法を確認します。色々な破線パターンが用意されているのではなく破線のパターンを自分で定義します。次のコンストラクタを使用します。
BasicStroke public BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase)
指定された属性を持つ新しい 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 **__****__****__****__****__****__****__**
サンプルプログラム
簡単なサンプルを一度試してみます。
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 )