非循環式によるグラデーション表示

広告

非循環式によるグラデーションを設定してみます。GradientPaintクラスのコンストラクタの中で非循環式を使う場合は次のコンストラクタを使用します。

シンプルな非循環式の GradientPaint オブジェクトを構築します。

パラメータ:
  x1 - ユーザー空間で最初に指定された Point の x 座標
  y1 - ユーザー空間で最初に指定された Point の y 座標
  color1 - 最初に指定された Point の Color
  x2 - ユーザー空間で 2 番目に指定された Point の x 座標
  y2 - ユーザー空間で 2 番目に指定された Point の y 座標
  color2 - 2 番目に指定された Point の Color 
例外: 
  NullPointerException - いずれか 1 つのカラーが null の場合

グラデーションを決定する為の2つの点の座標(x1, y1)と(x2, y2)を指定し、それぞれの点に設定する色を表すColorクラスのオブジェクトを引数に指定します。(Colorクラスについては『Colorクラス』を参照して下さい)。

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

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

  GradientPaint gradient = new GradientPaint(
      50.0f, 50.0f, Color.ORANGE, 
      190.0f, 110.0f, Color.YELLOW
  );
  g2.setPaint(gradient);

  g2.fill(new Rectangle2D.Double(20, 20, 200, 130));
}

「setPaint」メソッドを実行した後で実行された「draw」メソッド及び「fill」メソッドで設定が反映されます。

Point2Dクラスによる座標指定

2つの点の座標を指定する方法としてPoint2Dクラスのオブジェクトを使用するコンストラクタも用意されています。

シンプルな非循環式の GradientPaint オブジェクトを構築します。

パラメータ:
  pt1 - ユーザー空間で最初に指定された Point
  color1 - 最初に指定された Point の Color
  pt2 - ユーザー空間で 2 番目に指定された Point
  color2 - 2 番目に指定された Point の Color 
例外: 
  NullPointerException - カラーとポイントのいずれか 1 つが null の場合

Point2Dクラスは二次元空間における座標を表す2つの値を保持するためのクラスです。Point2Dクラスはabstractクラスであるため実際にはサブクラスであるPoint2D.DoubleクラスやPoint2D.Floatクラスを使います。詳しくは『Point2Dクラス』を参照して下さい。

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

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

  GradientPaint gradient = new GradientPaint(
      new Point2D.Double(50.0d, 50.0d), Color.ORANGE, 
      new Point2D.Double(190.0f, 110.0f), Color.YELLOW
  );
  g2.setPaint(gradient);

  g2.fill(new Rectangle2D.Double(20, 20, 200, 130));
}

サンプルプログラム

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

PaintTest2.java

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

public class PaintTest2 extends JPanel{

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

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

    GradientPaint gradient = new GradientPaint(
        50.0f, 50.0f, Color.ORANGE, 
        190.0f, 110.0f, Color.YELLOW
    );
    g2.setPaint(gradient);

    g2.fill(new Rectangle2D.Double(20, 20, 200, 130));

/*
    g2.setPaint(Color.black);
    g2.draw(new Ellipse2D.Double(45, 45, 10, 10));
    g2.draw(new Ellipse2D.Double(185, 105, 10, 10));
*/
  }
}

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

非循環式のグラデーション

上記のサンプルでコメントとなっている部分があります。コメントを外すとグラデーションの基準となっている2つの点が円で表示されます。

非循環式のグラデーション

今回は非循環式ですので、この2つの点の間にある領域はグラデーションとして表示されており、点よりも外側の領域はそれぞれの点に設定した色がそのまま表示されています。

( Written by Tatsuo Ikura )