- PR -

Graphicsについて

1
投稿者投稿内容
ミドリ
会議室デビュー日: 2003/04/02
投稿数: 13
投稿日時: 2003-04-02 21:48
はじめまして、marikoです。
最近、JAVAを始めました。
フレームを表示して、グラフを書きたいのですが、
1−VBのような、pixcelsperinchのような関数はありますか?
2−波線を表示できますか?
3−何も指定しない setSize( 500, 450 );はなんのサイズですか?
4−クローズドボタンのイベントの取り方などは何処に記述がありますか?
よろしくお願いします。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-04-04 14:52
こんにちは、さくらばです。

長文で、すいません。

引用:

marikoさんの書き込み (2003-04-02 21:48) より:
1−VBのような、pixcelsperinchのような関数はありますか?



VB をぜんぜん知らないので、よく分かりませんが、pixelsperinch
がスケーリング (座標変換) を行うためのメソッドであるならば、
java.awt.geom.AffineTransform クラスが使えます。

もし、単に ppi を変えるだけであるなら、例えば 96 ppi から 72 ppi
に変換するときは x = x / 96.0 * 72.0; とすればいいだけではない
でしょうか。

引用:

2−波線を表示できますか?



破線ではなくて波線ですか?
波線だとすると、標準で提供されている API ではできません。(破線
はできます)

自分で作るとすると

1. java.awt.Stroke インタフェースを実装したクラスを自作する。
2. java.awt.geom.GenericPath クラスの curveTo メソッドを
 繰り返し使用する。curveTo メソッドで 〜 のような線が描画
 できるので、それをつなげていくように描く方法です。

1 の方法の方が汎用的ですが、Stroke の動作を理解しなくてはい
けないので、面倒くさいです。2 はソースは簡単ですが、座標を
自分で計算しなくてはいけないので、これまた面倒です。

でも、これではあんまりなので....
Sun から提供されている GLF パッケージというのがあります
(GLF = Graphic Layers Framework)。この中の WaveStroke という
クラスで波線を描くことができます。

# これは Java 2D API Graphics という本のおまけなのですが、
# 日本語訳はでそうもありません。

GLF
http://developer.java.sun.com/developer/Books/2dgraphics/

サンプルを一番下に書いておきます。コンストラクタの第 1 引数
が線の太さ、第 2 が波の長さ、第 3 が波の高さになります。

GLF をダウンロードして解凍すると、glfbuild.bat というバッチ
があるので、これを実行すると classes というディレクトリがで
きてそこにコンパイルでできたクラスファイルがおかれています。

例えば、WaveLineSample.java を classes があるディレクトリに
おいたとしたら、次のようにコンパイルして、実行します。

コード:
javac -classpath classes WaveLineSample.java

java -classpath classes WaveLineSample



引用:

3−何も指定しない setSize( 500, 450 );はなんのサイズですか?



どのクラスで setSize をするのでしょうか。Frame クラスか
JFrame クラスの派生クラスであればウィンドウの大きさになりま
す。

JLabel などのコンポーネントの派生クラスであれば、コンポーネ
ントの大きさになります。しかし、レイアウトマネージャによっ
てサイズは自動的に変化するので、setSize は使えないことの方
が多いです。Swing であれば setSize の代わりに setPreferredSize
を使用します。

引用:

4−クローズドボタンのイベントの取り方などは何処に記述がありますか?



WindowListener でイベントを取ることができます。
もし、JFrame を使用していて、単に終了するとかウィンドウを
消去するだけであれば setDefaultCloseOperation メソッドで
動作を指定できます。

下のサンプルは setDefaultCloseOperation で行っていますが、
コメントのようにも記述することができます。

-----------------WaveLineSample.java----------------------
コード:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.geom.Line2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.JComponent;

import com.sun.glf.goodies.WaveStroke;

public class WaveLineSample extends JComponent {
    
    public WaveLineSample() {}

    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        Line2D.Double line = new Line2D.Double(20, 20, 360, 340);

        // 太さ 3 pixel, 長さ 10 pixel, 高さ 4 pixel の波線
        Stroke stroke1 = new WaveStroke(10, 20, 10);
        g2d.setPaint(Color.gray);
        g2d.setStroke(stroke1);

	g2d.draw(line);

        Stroke stroke2 = new WaveStroke(3, 20, 10);
        g2d.setPaint(Color.black);
        g2d.setStroke(stroke2);

	g2d.draw(line);
    }

    public static void main(String[] args) {
        WaveLineSample sample = new WaveLineSample();
        JFrame frame = new JFrame("Wave Line Sample");

        // フレームの大きさを設定する
        frame.setSize(400, 400);

        // クローズドボタンが押されたときの動作を設定する
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// こちらの書き方でも OK
//        frame.addWindowListener(new WindowAdapter() {
//            public void windowClosing(WindowEvent event) {
//                System.exit(0);
//            }
//        });

        frame.getContentPane().add(sample);
        frame.setVisible(true);
    }
}



ミドリ
会議室デビュー日: 2003/04/02
投稿数: 13
投稿日時: 2003-04-07 16:03
あしたばさん、
 どうもありがとうございます。
 細かく教えていただいて助かります。
 やっと、なんとかコンパイルエラーのでないように
 やりましたが、

C:\JAVA>java -classpath classes WaveLineSample
Exception in thread "main" java.lang.NoClassDefFoundError: WaveLineSample
 のエラーがでます。
 それと、-classpath classes は普通のpath指定では
 駄目なのですか?
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-04-08 01:34
さくらばです。

引用:

marikoさんの書き込み (2003-04-07 16:03) より:
あしたばさん、
 どうもありがとうございます。



「あしたば」ではないんですけど....

引用:

 やっと、なんとかコンパイルエラーのでないように
 やりましたが、

C:JAVA>java -classpath classes WaveLineSample
Exception in thread "main" java.lang.NoClassDefFoundError: WaveLineSample
 のエラーがでます。
 それと、-classpath classes は普通のpath指定では
 駄目なのですか?



すいません。前の投稿で java の起動の時のオプション指定が間違ってました。正しくは

java -classpath classes;. WaveLineSample

というようにカレントディレクトリを CLASSPATH に加える必要があります。
ミドリ
会議室デビュー日: 2003/04/02
投稿数: 13
投稿日時: 2003-04-08 18:25
「あしたば」ではないんですけど....
そうでした。m(..)m

java -classpath classes;. WaveLineSample

というようにカレントディレクトリを CLASSPATH に加える必要があります。
で。できました。どうもありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)