[java]paintメソッドをmain関数に書く方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
java君

[java]paintメソッドをmain関数に書く方法

#1

投稿記事 by java君 » 7年前

コード:

      public void paint(Graphics g)
        {
                g.drawImage(image,0,0,this);

        }


このpaintメソッドってメソッドとして宣言が必要でも、main関数から呼び出さなくても実行されますよね。
これが凄い気持ち悪いので、mainメソッドから呼び出さないと実行しないようにしたいんですが、それは可能ですか?
後このpaintメソッドの所属クラスを調べたい場合どうすればいいでしょう?上手くいきません。
Graphicsクラスのメソッドであることは分かるのですが、コードで取得したいと思います。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: [java]paintメソッドをmain関数に書く方法

#2

投稿記事 by みけCAT » 7年前

java君 さんが書きました:このpaintメソッドってメソッドとして宣言が必要でも、main関数から呼び出さなくても実行されますよね。
これが凄い気持ち悪いので、mainメソッドから呼び出さないと実行しないようにしたいんですが、それは可能ですか?
mainメソッドから呼び出すと実行されるようにしつつ、mainメソッドから呼び出さないと実行されないようにするのは不可能だと思います。
例えば、paintメソッドを呼び出すクラスを継承するのをやめ、privateにしても、mainメソッド以外の同じクラスのメソッドから呼び出せば実行されてしまいます。
そのような呼び出すメソッドを作らなかったとしても、リフレクションで実行されてしまうかもしれません。
(参考:Junitでprivateメソッドのテスト方法 - Qiita)

というわけで、mainメソッドから呼び出さないと実行しないようにするには、このメソッドを削除(コメントアウト)してしまうのがいいでしょう。
そうすれば実行しないので、「mainメソッドから呼び出さないならば実行しない」という条件を満たすことができます。
java君 さんが書きました:後このpaintメソッドの所属クラスを調べたい場合どうすればいいでしょう?上手くいきません。
なぜそのようなことがしたいのでしょうか?
java君さんのいう「所属クラス」とは何でしょうか?
その答えによっては、「我慢する、諦める」というのがいいかもしれません。
java君 さんが書きました:Graphicsクラスのメソッドであることは分かるのですが
java.awt.Graphicsクラスにも、それが継承しているjava.lang.Objectクラスにも、paintメソッドはありません。
どうしてそう分かる(と思う)のですか?
オフトピック
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

hide

Re: [java]paintメソッドをmain関数に書く方法

#3

投稿記事 by hide » 7年前

このpaintメソッドってメソッドとして宣言が必要でも、main関数から呼び出さなくても実行されますよね。
これが凄い気持ち悪いので、mainメソッドから呼び出さないと実行しないようにしたいんですが、
自分で呼び出す方が大変気持ち悪いです。画面の描画は1度呼べばいいというものではありません。
Component#paintは描画が必要になるたびに何度も呼び出されているはずです。
これを使わないとなると、
・最小化など方法で画面が見えなくなった場合に表示されなくても諦める。
・ご自身で再描画が必要なタイミングを計算して頑張る。
のようなことになるでしょう。
自分でタイミングを考えるのが大変だから継承するのです。

java君

Re: [java]paintメソッドをmain関数に書く方法

#4

投稿記事 by java君 » 7年前

確かに再描画の必要はしょっちゅうだからmainに書くなんて無理ですよね。
ちなみにこのpaintメソッドを実行制御してるメソッドを見てみたいんですがありますか?
どんな中身かきになります。

hide

Re: [java]paintメソッドをmain関数に書く方法

#5

投稿記事 by hide » 7年前

とりあえずjdk自体はこういったところで見れたりします。openJDKですが基本一緒のはずです。
grepcode
どういうやり方しているのかとかは完全に私の知る部分から外れるのでわからないです。

Math

Re: [java]paintメソッドをmain関数に書く方法

#6

投稿記事 by Math » 7年前

http://csi.nisinippon.com/ecl.png描画処理の再定義
AWT コンポーネントに何らかの図やイメージを描画するには paint() メソッドをオーバーライドしました
しかし、JComponent を継承する Swing コンポーネントの場合、paint() メソッドはコンポーネント全体
の描画を総括するトップメソッドとして定義されています。
Swing コンポーネントは、コンポーネントの描画以外に、子コンポーネントの描画やコンポーネントの
境界線となる枠を部品化しています。子コンポーネントの描画は paintChildren() メソッドで、境界線は
paintBorder() メソッドで行われます。paint() メソッドはこれらのメソッドを呼び出して、
コンポーネントの外観を整える役割を持っているため、サブクラスでこれをオーバーライドしてしまうと
、このルールが破綻してしまう可能性があるため、推奨できません。
paint() メソッドをオーバーライドする場合は、Swing コンポーネントの内部動作を理解したうえで行う
必要があります。
このような事情があるため、Swing コンポーネントの描画処理を再定義する場合は paintComponent()
メソッドをオーバーライドします。
--まだまだDeepな話が続くのですがeclipseでJavaの実例を勉強中なのでサンプルが出来ました。。

コード:

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class paintSmp extends JFrame implements Runnable {	
	private JComponent label;

	public static void main(String args[]) {
		JFrame win = new paintSmp();
		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.setVisible(true);
	}
	public paintSmp() { 
		label = new LabelEx("Sample Program");
		getContentPane().add(label);
		new Thread(this).start();
	}

	private int color = 0;
	private boolean increase = true;
	public void run() {
		while(true) {
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					label.setFont(new Font("Serif" , Font.PLAIN , 20));
					label.setForeground(new Color(color));
					label.repaint();
				}
			});
			if (increase) color++;
			else color--;

			if (color == 255) increase = false;
			else if (color == 0) increase  = true;

			try { Thread.sleep(10); }
			catch(InterruptedException err) {
				//例外処理をここに記述します。
			}
		}
	}
}

class LabelEx extends JComponent {
	private String label;
	public LabelEx(String label) { this.label = label; }

	public void paintComponent(Graphics g) {
		if (label != null) {
			FontMetrics fm = getFontMetrics(getFont());
			g.drawString(label ,
				getWidth() / 2 -  fm.stringWidth(this.label) / 2 ,
				getHeight() / 2 + fm.getDescent()
			);
		}
	}
}

java君

Re: [java]paintメソッドをmain関数に書く方法

#7

投稿記事 by java君 » 7年前

難しいことは考えずにとりあえずpaint()の恩恵を授かろうってことですねw
詳しいご説明ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る